Как преобразовать Excel в CSV с помощью OpenXML SDK?

У меня есть требование преобразовать файлы Excel (2010) в CSV. В настоящее время я использую Excel Interop для открытия и SaveAs csv, что хорошо работает. Однако у Interop есть некоторые проблемы в той среде, где мы его используем, поэтому я ищу другое решение.

Я нашел способ работать с файлами Excel без взаимодействия - это использовать OpenXML SDK. Я собрал код, чтобы перебирать все ячейки на каждом листе и просто записывать их в другой файл в 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(','));
            }
        }
    }
}

Если у меня есть следующие данные файла Excel:

one,two,three
,,
last,,row

, я получу следующий CSV (что неверно):

one,two,three
last,row
5
задан TheSean 26 August 2011 в 18:14
поделиться