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

我正在尝试使用c#和互操作库将具有多个工作表的xls或xlsx文件转换为一个CSV文件。 我只是获取CSV文件中的一张。 我知道我可以指定工作表保存为或更改活动工作表以保存该工作表,但我正在寻找一个解决scheme,将所有工作表附加到同一个CSV文件,将使用xls和xlsx文件。 我自动化这个,不关心什么是在Excel文件只是想拉出string值并将其附加到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); 

这甚至有可能吗?

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

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

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

http://exceldatareader.codeplex.com/

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

更新[7/15/2013]。 这是我完成的代码。 不是很花哨,但它完成了工作。 所有表单都是DataSet中的表格,所以您只需循环表格即可添加到目标上。 我输出到一个MongoDB,但我猜你可以交换一个StreamWriter CSV文件相当容易。

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