我可以通过ClosedXML将EXCEL工作表保存为CSV吗?

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

例如:

var workbook = new XLWorkbook(fileName); IXLWorksheet worksheet; workbook.Worksheets.TryGetWorksheet(sheetName, out worksheet); worksheet. /How to Save it as CSV? 

不,它不能直接在ClosedXML中使用。 你必须使用循环或LINQ来build立你自己的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>())) )); 

其他答案将无法生成有效的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的答案

错了

 row.LastCellUsed(false) 

这不是一个正确的CSV格式。 最后的列将是空的,而不是获得相对分隔符。

正如@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>())) ));