1

複数のシートを含むxlsまたはxlsxファイルをc#と相互運用ライブラリを使用して1つのCSVファイルに変換しようとしています。CSVファイルで1枚しか取得していません。保存するシートを指定したり、アクティブなシートを変更してそのシートを保存したりできることはわかっていますが、xlsファイルとxlsxファイルの両方で機能する同じCSVファイルにすべてのシートを追加するソリューションを探しています。私はこれを自動化しており、Excelドキュメントの内容は気にせず、文字列値を取り出してcsvファイルに追加したいだけです。これが私が使用しているコードです:

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = false;
app.DisplayAlerts = false;
Workbook wkb = app.Workbooks.Open(fullFilePath);
wkb.SaveAs(newFileName, XlFileFormat.xlCSVWindows);

これも可能ですか?

4

1 に答える 1

0

私は同様の状況に取り組み始めたばかりですが、これであなたのニーズに対応できると思います。

http://www.codeproject.com/Articles/246772/Convert-xlsx-xls-to-csv

これは、NuGetから取得できるExcelDataReaderAPIを使用します

http://exceldatareader.codeplex.com/

ティムが言っていたように、列と構造がシート間で同じであることを確認し、場合によっては検証する必要があります。また、最初のシートの後のすべてのシートのヘッダー行を食べる必要がある場合もあります。終了したら、アップデートといくつかのコードサンプルを投稿します。

[2013年7月15日]を更新します。これが私の完成したコードです。それほど派手ではありませんが、それは仕事を成し遂げます。すべてのシートはDataSet内のテーブルであるため、宛先に追加するテーブルをループするだけです。MongoDBに出力していますが、CSVファイルのStreamWriterと簡単に交換できると思います。

        private static void ImportValueSetAttributeFile(string filePath)
    {
        FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

        // Reading from a OpenXml Excel file (2007 format; *.xlsx)
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

        // DataSet - The result of each spreadsheet will be created in the result.Tables
        DataSet result = excelReader.AsDataSet();

        // Free resources (IExcelDataReader is IDisposable)
        excelReader.Close();

        var connectionString = ConfigurationManager.ConnectionStrings[0].ConnectionString;
        var database = ConfigurationManager.AppSettings["database"];
        var mongoAccess = new MongoDataAccess(connectionString, database);

        var cdm = new BaseDataManager();

        int ind = 0;

        for (int i = 0; i < result.Tables.Count; i++)
        {
            int row_no = 1;
            while (row_no < result.Tables[ind].Rows.Count) // ind is the index of table
                // (sheet name) which you want to convert to csv
            {
                var currRow = result.Tables[ind].Rows[row_no];
                var valueSetAttribute = new ValueSetAttribute()
                    {
                        CmsId = currRow[0].ToString(),
                        NqfNumber = currRow[1].ToString(),
                        ValueSetName = currRow[2].ToString(),
                        ValueSetOid = currRow[3].ToString(),
                        Definition = currRow[4].ToString(),
                        QdmCategory = currRow[5].ToString(),
                        Expansion = currRow[6].ToString(),
                        Code = currRow[7].ToString(),
                        Description = currRow[8].ToString(),
                        CodeSystem = currRow[9].ToString(),
                        CodeSystemOid = currRow[10].ToString(),
                        CodeSystemVersion = currRow[11].ToString()
                    };

                cdm.AddRecords<ValueSetAttribute>(valueSetAttribute, "ValueSetAttributes");

                row_no++;
            }
            ind++;
        }
    }
于 2013-07-09T16:06:12.137 に答える