转换xls或xlsx文件与多个工作表到一个csv文件使用互操作

本文关键字:文件 互操作 一个 csv xlsx xls 转换 工作 | 更新日期: 2023-09-27 17:49:18

我正在尝试使用c#和互操作库将具有多个工作表的xls或xlsx文件转换为一个CSV文件。我只得到CSV文件中的一个表。我知道我可以指定要保存的工作表或更改活动工作表以保存该工作表,但我正在寻找一种解决方案,将所有工作表附加到相同的CSV文件,将与xls和xlsx文件一起工作。我是自动化的,不关心什么是在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);

这可能吗?

转换xls或xlsx文件与多个工作表到一个csv文件使用互操作

我刚刚开始处理类似的情况,但我相信这可能会满足您的需求:

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

这使用了ExcelDataReader api,你可以从NuGet

获得http://exceldatareader.codeplex.com/

就像Tim说的,你必须确保并可能验证表之间的列和结构是相同的。您可能还必须在第一个表之后吃掉所有表的标题行。一旦我完成,我会发布一个更新和一些代码示例。

更新(7/15/2013)。这是我完成的代码。不是很花哨,但它可以完成工作。所有的工作表都是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++;
        }
    }