web-dev-qa-db-ja.com

データテーブルをExcel2007(.xlsx)に変換する

DataTableがあります。Excel2007形式に変換してExcelファイル(.xlsx)2007として保存する必要があります。

誰かが私がこれを達成するのを手伝ってくれる?

10
happysmile

OLEDBデータプロバイダーを使用して、Excelを別のADO.NETデータソースとして扱い、DataTable行をループしてExcelスプレッドシートに挿入することができます。これは、多くの詳細を説明するMicrosoftKBの記事です。

http://support.Microsoft.com/kb/316934/en-us

覚えておくべき重要なことは、ワークブックとワークブック内にシートを作成でき、名前の末尾に「$」を追加することで既存のシートを参照できることです。シート名の末尾の「$」を省略すると、OLEDBプロバイダーはそれが新しいシートであると見なし、作成を試みます。

ワークシート名に続くドル記号は、テーブルが存在することを示します。この記事の「新しいワークブックとテーブルの作成」セクションで説明されているように、新しいテーブルを作成する場合は、ドル記号を使用しないでください。

2003(.xls)または2007形式(xlsx)で作成およびスプレッドシートを作成できます。これは、接続文字列で定義されます。書き込み先のファイルを指定し、拡張子を指定するだけです。正しいOLEDBプロバイダーバージョンを使用していることを確認してください。

2003(.xls)バージョンを作成する場合は、次の接続文字列を使用します。

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES

2007(.xlsx)バージョンを作成する場合は、次の接続文字列を使用します。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES

XLSXファイルを作成するには、MicrosoftからACEプロバイダーをダウンロードする必要がある場合があります。あなたはそれを見つけることができます ここ

私は通常XLSプロバイダーを使用しているので、XLSXプロバイダーとはあまり連携していません。

お役に立てれば。他にご不明な点がありましたらお知らせください。

8
David Hoerster

私はしばらく前に会社のために次のコードを書きました。任意のクラスタイプのEnumerableを受け取り、そのすべての(get)プロパティをExcelにエクスポートし、Excelを開きます。 DataTableに対して同様のことができるはずです。 Microsoft.Office.Interop.Excelへの参照を追加する必要があることを忘れないでください

    public static void ExportToExcel<T>(IEnumerable<T> exportData)
    {
        Excel.ApplicationClass Excel = new Excel.ApplicationClass();
        Excel.Workbook workbook = Excel.Application.Workbooks.Add(true);
        PropertyInfo[] pInfos = typeof(T).GetProperties();
        if (pInfos != null && pInfos.Count() > 0)
        {
            int iCol = 0;
            int iRow = 0;
            foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
            {
                // Add column headings...
                iCol++;
                Excel.Cells[1, iCol] = eachPInfo.Name;
            }
            foreach (T item in exportData)
            {
                iRow++;
                // add each row's cell data...
                iCol = 0;
                foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
                {
                    iCol++;
                    Excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null);
                }

            }
            // Global missing reference for objects we are not defining...
            object missing = System.Reflection.Missing.Value;
            // If wanting to Save the workbook...   
            string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm";
            workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
            // If wanting to make Excel visible and activate the worksheet...
            Excel.Visible = true;
            Excel.Worksheet worksheet = (Excel.Worksheet)Excel.ActiveSheet;
            Excel.Rows.EntireRow.AutoFit();
            Excel.Columns.EntireColumn.AutoFit();
            ((Excel._Worksheet)worksheet).Activate();
        }
    }
3
Viv

Excel 2007形式に入れてExcelファイル(.xlsx)2007として保存する必要があるDataTableがあります。

誰かが私がこれを達成するのを手伝ってくれる?

私の無料のC#クラスをプロジェクトに追加するだけで、1行のコードが必要です。

詳細(無料でダウンロード可能なソースコードとサンプルプロジェクトを含む)はこちら:

Mikesナレッジベース-Excelにエクスポート

私のライブラリは、無料のMicrosoft OpenXMLライブラリ(ダウンロードでも提供されています)を使用してファイルを書き込むため、重量のあるVSTOライブラリを使用する必要はありません。 、またはExcelをサーバーにインストールします。

また、データのストリームをコンマ区切りのテキストファイルに書き込む他のメソッドではなく、real。xlsxファイルを作成しますが、名前を付けます.xlsファイルとして。

ちなみに、私はOLEDBを使用してExcelファイルに書き込むのにloadsの問題がありました。特に、Office2007でWindows764ビットを実行していたためです(これは32ビット)であり、Microsoft ACEプロバイダーは64ビット版である必要があります...しかし、これをインストールすることはできません。 32ビットバージョンのOfficeがインストールされている。

そのため、Officeをアンインストールし、ACEドライバーをインストールしてから、Officeを再インストールする必要があります。
しかし、それでも、OLEDBの使用をあきらめました。それは十分に安定していませんでした。

2
Mike Gledhill

私が5年前に好きだった古いコードでこれを見つけました...

public static void DataTableToExcel(DataTable tbl)
{
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    foreach (DataColumn c in tbl.Columns)
    {
        context.Response.Write(c.ColumnName + ";");
    }
    context.Response.Write(Environment.NewLine);
    foreach (DataRow r in tbl.Rows)
    {
        for (int i = 0; i < tbl.Columns.Count; i++)
        {
            context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";");
        }
        context.Response.Write(Environment.NewLine);
    }
    context.Response.ContentType = "text/csv";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.csv");
    context.Response.End();
}

これにより、Excel2007で開くことができるCSVファイルを含む応答がASP.NETから出力されます。必要に応じて、拡張子を変更してExcelを模倣することができ、次の行を置き換えるだけで機能するはずです。

    context.Response.ContentType = "application/vnd.ms-Excel";
    context.Response.AppendHeader("Content-Disposition",
        "attachment; filename=export.xlsx");

複雑なことをする必要がない場合は、CSVが最も簡単な方法です。本当にネイティブ形式のExcel2007ファイルである必要がある場合は、Officeライブラリを使用してビルドするか、CSVから変換してから、提供/保存する必要があります。

このリンクも役立つ場合があります。

Excel 2007にデータをエクスポートするときにExcelプロンプトウィンドウを回避する方法

1
Kelsey

あなたはたくさんの相互運用をしなければならないでしょう、ここにチュートリアルがあります、それが役立つことを願っています。 リンクテキスト

0
Luiscencio

他の誰かが「csvに保存」オプションを投稿したことを確認しました。それはOPが探していた答えではなかったようですが、これがテーブルのヘッダーを含む私のバージョンです

    public static String ToCsv(DataTable dt, bool addHeaders)
    {
        var sb = new StringBuilder();
        //Add Header Header
        if (addHeaders)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(dt.Columns[x].ColumnName);
            }
            sb.AppendLine();
        }
        //Add Rows
        foreach (DataRow row in dt.Rows)
        {
            for (var x = 0; x < dt.Columns.Count; x++)
            {
                if (x != 0) sb.Append(",");
                sb.Append(row[dt.Columns[x]]);
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
0
curt