Excel (2010) 파일을 CSV로 변환해야한다는 요구 사항이 있습니다. 현재 Excel Interop을 사용하여 CSAS를 열고 SaveAs를 사용하고 있습니다. 그러나 Interop은 우리가 사용하는 환경에 문제가 있으므로 다른 해결책을 찾고 있습니다.OpenXML SDK를 사용하여 Excel을 CSV로 어떻게 변환합니까?
OpenXML SDK를 사용하여 interop없이 Excel 파일로 작업하는 방법을 발견했습니다. 각 시트의 모든 셀을 반복 처리하고 CSV의 다른 파일에 코드를 씁니다.
빈 행과 셀을 처리하는 데 문제가 하나 있습니다. 이 코드에서는 빈 행과 셀이 완전히 존재하지 않으므로 그 행을 알 수있는 방법이 없습니다. 공백을 포함하여 모든 행과 셀을 반복하여 반복 할 수 있습니까?
string filename = @"D:\test.xlsx";
string outputDir = Path.GetDirectoryName(filename);
//--------------------------------------------------------
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, false))
{
foreach (Sheet sheet in document.WorkbookPart.Workbook.Descendants<Sheet>())
{
WorksheetPart worksheetPart = (WorksheetPart) document.WorkbookPart.GetPartById(sheet.Id);
Worksheet worksheet = worksheetPart.Worksheet;
SharedStringTablePart shareStringPart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringItem[] items = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();
// Create a new filename and save this file out.
if (string.IsNullOrWhiteSpace(outputDir))
outputDir = Path.GetDirectoryName(filename);
string newFilename = string.Format("{0}_{1}.csv", Path.GetFileNameWithoutExtension(filename), sheet.Name);
newFilename = Path.Combine(outputDir, newFilename);
using (var outputFile = File.CreateText(newFilename))
{
foreach (var row in worksheet.Descendants<Row>())
{
StringBuilder sb = new StringBuilder();
foreach (Cell cell in row)
{
string value = string.Empty;
if (cell.CellValue != null)
{
// If the content of the first cell is stored as a shared string, get the text
// from the SharedStringTablePart. Otherwise, use the string value of the cell.
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
value = items[int.Parse(cell.CellValue.Text)].InnerText;
else
value = cell.CellValue.Text;
}
// to be safe, always use double quotes.
sb.Append(string.Format("\"{0}\",", value.Trim()));
}
outputFile.WriteLine(sb.ToString().TrimEnd(','));
}
}
}
}
나는 다음 엑셀 파일의 데이터가있는 경우 :
one,two,three
,,
last,,row
I (잘못) 다음 CSV를 얻을 것이다 :
one,two,three
last,row
가되지는 OleDbConnection합니까 파일, 탭은 엑셀의 각 시트의 구분? Open XML SDK의 장점은 Excel이 필요하지 않다는 것입니다. –
아니요, 필수 사항은 아닙니다. 파일을 이진 데이터 저장소로 취급합니다. 나는 어떤 이유로 2 ~ 3 년마다이 일을 끝낸다. :) –
나는 OpenXml 작업을 많이한다는 것에 주목해야한다 ... 이것은 핵을 사용하여 모기를 죽이는 경우가 될 것이다. –