使用interop将具有多个工作表的xls或xlsx文件转换为一个csv文件

时间:2012-12-20 20:56:12

标签: c# .net excel csv interop

我正在尝试使用c#和interop库将包含多个工作表的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);

这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

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

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

这使用了您可以从NuGet获得的ExcelDataReader api

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++;
        }
    }