2012-12-20 86 views
1

我試圖用多個工作表將xls或xlsx文件轉換爲使用c#和interop庫的一個CSV文件。我只獲取CSV文件中的一張。我知道我可以指定工作表保存爲或更改活動工作表以保存該工作表,但我正在尋找解決方案將所有工作表附加到可用於xls和xlsx文件的同一CSV文件。我自動化這個,不關心什麼是在Excel文件只是想拉出字符串值並將其附加到CSV文件。這裏是我使用的代碼:使用interop將具有多個工作表的xls或xlsx文件轉換爲一個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

所有的表格格式都完全一樣嗎?例如 - 他們每個人都有一個標題行?組合內容是否太大而無法放在一張紙上? –

+1

CSV文件基本上是原始文本文件,不支持多個選項卡。如果圖紙具有相同的格式,則可以將內容添加到所有其他格式的圖像中。 –

回答

0

我纔剛剛開始解決類似的情況,但我認爲這可能滿足您的需求:

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

它使用ExcelDataReader API,你可以從的NuGet

http://exceldatareader.codeplex.com/

得到

像蒂姆說的那樣,你將不得不確保並且可能驗證表單和列之間的結構是相同的。您可能還必須在第一張紙上吃掉所有紙張上的標題行。完成後,我會發布更新和一些代碼示例。

更新[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++; 
     } 
    } 
相關問題