16

私はここでこの問題について多くの議論があると信じています. しかし、私はすべての投稿を読んで試してみましたが、c#では機能しません。私の目標は、既存の csv ファイルがあるという単純なものです。エクセルファイルを変換して完了したいだけです。多くの人が spire.xls を使用すると言いましたが、MS .office.interop.excel で処理できると思います。

.csv から .xlsx への Excel ファイルの変換

上記の問題を読みましたが、これは私の問題と同じです。しかし、上記のコードは私のPCでは機能しません..これを使用するには他のdllをインポートする必要がありますか? そのサイトからコードをコピーするだけです。以下にもう一度コピーします...

現在、LibをMS.office.interop.excelおよびMS.office.interop.coreとして使用しています

Application app = new Application();
Workbook wb = app.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing,               Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.SaveAs(@"C:\testcsv.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing,    Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
wb.Close();
app.Quit();

ここには多くのエラーがあります。変更コードは以下にあり、現在は参照で MS.office.interop.excel と MS.office.interop.core のみを使用しています。別のdllファイルを使用する必要があるようです。とにかく、私はそのコードに従って新しいコードを作成しました。エラーを減らしますが、これが正しいアプローチかどうかはわかりません。以下は私が今試したことです。

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;

System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

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

xlWorkBook = xlApp.Workbooks.Open(@"C:\testcsv.csv", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.SaveAs(@"C:\testcsv.xlsx",    XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
xlWorkBook.Close(); 

ここにエラーメッセージがあります

エラー 3 名前 'XlFileFormat' は現在のコンテキストに存在しません C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 54 DC_Test
エラー 4 名前 'XlSaveAsAccessMode' は存在しません現在のコンテキストに存在します C:\Users\jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 528 142 DC_Test
エラー 4 メソッド 'Close' のオーバーロードはありません '0' 引数を取ります C:\Users \jochoi\Desktop\joseph_BT_전류_code\DC_Test - ver01\DC_Test\DC.cs 525 13 DC_Test

私の目標は、既存の csv ファイルを取得して、Excel ファイルに変更することです。その答えは私のPCでは機能しないため、誰かが他の解決策を持っていますか. (c#)

4

3 に答える 3

49

特にサーバー環境でコードを実行することを計画している場合、COM 相互運用は最適なソリューションではありません。

Office が不安定な動作を示したり、/または、この環境で Office を実行するとデッドロックが発生します。

もう 1 つのアプローチは、その目的に適したコンポーネントを使用することです。
私はEEplusを使用しましたが、それは汚い仕事をします。LGPL ライセンスを取得していますが、作成者は商用製品で使用することを心配していないようです。

nuget パッケージをインストールするだけです。

Install-Package EPPlus

次のコードを使用します。

using System.IO;
using OfficeOpenXml;

class Program
{
    static void Main(string[] args)
    {
        string csvFileName = @"FL_insurance_sample.csv";
        string excelFileName = @"FL_insurance_sample.xls";

        string worksheetsName = "TEST";

        bool firstRowIsHeader = false;

        var format = new ExcelTextFormat();
        format.Delimiter = ',';
        format.EOL = "\r";              // DEFAULT IS "\r\n";
        // format.TextQualifier = '"';

        using (ExcelPackage package = new ExcelPackage(new FileInfo(excelFileName)))
        {
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetsName);
            worksheet.Cells["A1"].LoadFromText(new FileInfo(csvFileName), format, OfficeOpenXml.Table.TableStyles.Medium27, firstRowIsHeader);
            package.Save();
        }

        Console.WriteLine("Finished!");
        Console.ReadLine();
    }
}

を使用して CVS の構造を構成できますExcelTextFormat

hereから取得したいくつかのデータでテストしました。

その他のサンプルはこちらにあります

アップデート:

もう 1 つのオプションは、CSV ファイルを自分でテキスト ファイルとして読み取ることです。

private IEnumerable<string[]> ReadCsv(string fileName, char delimiter = ';')
{
    var lines = System.IO.File.ReadAllLines(fileName, Encoding.UTF8).Select(a => a.Split(delimiter));
    return (lines);
}

NPOIClosedXMLなどの他のオープンソース プロジェクトを使用します。 NPOIClosedXMLではCSVを読み取って変換することはできませんが、関数を使用するReadCsvと自分で変換できます。

これらのプロジェクトはどちらも寛容なライセンスを持っています。

NPOI 変換:

private static bool ConvertWithNPOI(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    IWorkbook workbook = new XSSFWorkbook();
    ISheet worksheet = workbook.CreateSheet(worksheetName);

    foreach (var line in csvLines)
    {
    IRow row = worksheet.CreateRow(rowCount);

    colCount = 0;
    foreach (var col in line)
    {
        row.CreateCell(colCount).SetCellValue(TypeConverter.TryConvert(col));
        colCount++;
    }
    rowCount++;
    }

    using (FileStream fileWriter = File.Create(excelFileName))
    {
       workbook.Write(fileWriter);
       fileWriter.Close();
    }

    worksheet = null;
    workbook = null;

    return (true);
}

ClosedXML 変換:

private static bool ConvertWithClosedXml(string excelFileName, string worksheetName, IEnumerable<string[]> csvLines)
{
    if (csvLines == null || csvLines.Count() == 0)
    {
    return (false);
    }

    int rowCount = 0;
    int colCount = 0;

    using (var workbook = new XLWorkbook())
    {
    using (var worksheet = workbook.Worksheets.Add(worksheetName))
    {
        rowCount = 1;
        foreach (var line in csvLines)
        {
        colCount = 1;
        foreach (var col in line)
        {
            worksheet.Cell(rowCount, colCount).Value = TypeConverter.TryConvert(col);
            colCount++;
        }
        rowCount++;
        }

    }
    workbook.SaveAs(excelFileName);
    }

    return (true);
}

興味のある方は、github にサンプル プロジェクトがあり、3 つの製品を比較してパフォーマンスをテストできます。

于 2014-10-30T10:11:51.683 に答える
-1

ファイルの先頭に次の行を挿入します。

using Microsoft.Office.Interop.Excel;

これには、XlFileFormat および XlSaveAsAccessMode クラスを使用するために必要な名前空間が含まれます。これが機能しない場合は、この DLL への参照をプロジェクトにも追加する必要がある場合があります。

Close メソッドは、次の引数を取ります。

  1. 変更内容を保存
  2. ファイル名
  3. ルートワークブック

そのためのドキュメントはhereです。

それが役立つことを願っています。

于 2014-10-30T09:20:27.637 に答える