2012-12-20 3 views
1

여러 시트가있는 xls 또는 xlsx 파일을 C# 및 interop 라이브러리를 사용하여 하나의 CSV 파일로 변환하려고합니다. CSV 파일에서 한 장만 가져옵니다. 내가 저장할 시트를 지정할 수 또는 그 하나를 저장하려면 활성 시트를 변경할 수 있지만 xls 및 xlsx 파일을 모두 작동하는 동일한 CSV 파일에 모든 시트를 추가 할 수있는 솔루션을 찾고 있는데요. 나는 이것을 자동화하고 엑셀 문서가 문자열 값을 꺼내서 csv 파일에 추가하기를 원하는지 상관하지 않는다. 다음은 현재 사용중인 코드입니다.여러 시트가있는 xls 또는 xlsx 파일을 interop을 사용하여 하나의 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

이 당신이

http://exceldatareader.codeplex.com/

NuGet

에서 얻을 수있는 ExcelDataReader API를 사용을

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++; 
     } 
    } 
관련 문제