web-dev-qa-db-ja.com

データをExcelファイルにエクスポートする方法

データが入ったExcelファイルがあります。コードで作成した別のExcelファイルに、特定の行を書き込みたいと思います。ところで、これらの行のインデックスはリストにあります。どうやってやるの?

16
M_Mogharrabi

MSはOpenXML SDK V 2.5を提供しています- https://msdn.Microsoft.com/en-us/library/bb448854(v = office.15).aspx を参照してください

これにより、MS Officeファイル(Excelを含む)の読み取りと書き込みが可能になります...

別のオプションを参照してください http://www.codeproject.com/KB/office/OpenXML.aspx

レンダリングや数式などが必要な場合は、AsposeやFlexcelなどのさまざまな商用ライブラリがあります。

12
Yahia
 private void button1_Click(object sender, EventArgs e)
    {
        Excel.Application xlApp ;
        Excel.Workbook xlWorkBook ;
        Excel.Worksheet xlWorkSheet ;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Add(misValue);

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";

        xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);

        MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls");
    }

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }

上記のコードは直接オフになっています csharp.net サイトをご覧ください。

5
Jethro

interopを使用してExcelを開き、データが完了したら列幅を変更しました。 interopを使用してデータを新しいExcelブックに吐き出す場合(これが必要な場合)、非常に遅くなります。代わりに、[〜#〜] csv [〜#〜]を生成してから、ExcelでCSVを開きました。これには独自の問題がありますが、これが最も簡単な方法であることがわかりました。

まず、CSVを変換します。

        // Convert array data into CSV format.
        // Modified from http://csharphelper.com/blog/2018/04/write-a-csv-file-from-an-array-in-c/.
        private string GetCSV(List<string> Headers, List<List<double>> Data)
        {
            // Get the bounds.
            var rows = Data[0].Count;
            var cols = Data.Count;
            var row = 0;


            // Convert the array into a CSV string.
            StringBuilder sb = new StringBuilder();

            // Add the first field in this row.
            sb.Append(Headers[0]);

            // Add the other fields in this row separated by commas.
            for (int col = 1; col < cols; col++)
                sb.Append("," + Headers[col]);

            // Move to the next line.
            sb.AppendLine();

            for (row = 0; row < rows; row++)
            {
                // Add the first field in this row.
                sb.Append(Data[0][row]);

                // Add the other fields in this row separated by commas.
                for (int col = 1; col < cols; col++)
                    sb.Append("," + Data[col][row]);

                // Move to the next line.
                sb.AppendLine();
            }

            // Return the CSV format string.
            return sb.ToString();
        }

次に、Excelにエクスポートします!

    public void ExportToExcel()
    {

        // Initialize app and pop Excel on the screen.
        var excelApp = new Excel.Application
        {
            Visible = true
        };

        // I use unix time to give the files a unique name that's almost somewhat useful.
        DateTime dateTime = DateTime.UtcNow;
        long unixTime = ((DateTimeOffset)dateTime).ToUnixTimeSeconds();
        var path = @"C:\Users\my\path\here + unixTime + ".csv";

        var csv = GetCSV();
        File.WriteAllText(path, csv);
        // Create a new workbook and get its active sheet.
        excelApp.Workbooks.Open(path);

        var workSheet = (Excel.Worksheet)excelApp.ActiveSheet;

        // iterrate through each value and throw it in the chart
        for (var column = 0; column < Data.Count; column++)
        {
            ((Excel.Range)workSheet.Columns[column + 1]).AutoFit();
        }

        currentSheet = workSheet;

    }

また、いくつかのものをインストールする必要があります...

  1. ソリューションエクスプローラーでソリューションを右クリックし、[NuGetパッケージの管理]を選択します。 Microsoft.Office.Interop.Excelを追加します。
  2. Interopが望む方法でプロジェクトを作成した場合、実際に動作する可能性があります。それでも動作しない場合は、別のカテゴリで新しいプロジェクトを作成する必要がありました。 [新規]> [プロジェクト]で、[Visual C#]> [Windowsデスクトップ]> [コンソールアプリ]を選択します。そうしないと、相互運用ツールが機能しません。

私が何かを忘れた場合、ここに私の「使用する」ステートメントがあります:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
1
bearacuda13

また、C#を使用してExcelスプレッドシートにデータをエクスポートする際の同様の問題に苦労していました。外部DLLを操作するさまざまな方法を試しましたが、運がありませんでした。

エクスポート機能については、外部DLLを扱うものを使用する必要はありません。代わりに、応答のヘッダーとコンテンツタイプを維持するだけです。

ここに私がかなり役立つと思う記事があります。この記事では、ASP.NETを使用してデータをExcelスプレッドシートにエクスポートする方法について説明しています。

http://www.icodefor.net/2016/07/export-data-to-Excel-sheet-in-asp-dot-net-c-sharp.html

0
Tapan kumar