11

是否可以通过 ClosedXML 将工作簿的工作表保存为 CSV?

例如:

var workbook = new XLWorkbook(fileName);
IXLWorksheet worksheet;
workbook.Worksheets.TryGetWorksheet(sheetName, out worksheet);

如何将其另存为 CSV?

4

4 回答 4

18

如果单元格有分隔符,其他答案将无法生成有效的 CSV,所以这是一种更好的方法

var lastCellAddress = worksheet.RangeUsed().LastCell().Address;
File.WriteAllLines(csvFileName, worksheet.Rows(1, lastCellAddress.RowNumber)
    .Select(r => string.Join(",", r.Cells(1, lastCellAddress.ColumnNumber)
            .Select(cell =>
        {
            var cellValue = cell.GetValue<string>();
            return cellValue.Contains(",") ? $"\"{cellValue}\"" : cellValue;
        }))));

这是基于@Extragorey的回答

于 2017-05-23T18:32:46.933 回答
5

不,直接在 ClosedXML 中是不可能的。您必须使用循环或 LINQ 来构建您自己的 CSV 文件。

例如:

System.IO.File.WriteAllLines(csvFileName,
    worksheet.RowsUsed().Select(row =>
        string.Join(";", row.Cells(1, row.LastCellUsed(false).Address.ColumnNumber)
                            .Select(cell => cell.GetValue<string>()))
 ));
于 2014-11-24T12:26:21.477 回答
1

正如@Emanuele 指出的那样,@Raidri 的答案不会生成正确的 CSV 格式,而且它也完全省略了空白行。要解决这个问题:

var lastCellAddress = worksheet.RangeUsed().LastCell().Address;
System.IO.File.WriteAllLines(csvFileName, worksheet.Rows(1, lastCellAddress.RowNumber)
    .Select(row => String.Join(",", row.Cells(1, lastCellAddress.ColumnNumber)
        .Select(cell => cell.GetValue<string>()))
));
于 2017-03-06T00:17:56.433 回答
0

错在

row.LastCellUsed(false)

这不是 csv 的正确格式。最后一列将为空而不是获取相对分隔符。

于 2015-07-02T07:21:52.870 回答