是否可以通过ClosedXML将工作簿的工作表保存为CSV?
例如:
var workbook = new XLWorkbook(fileName);
IXLWorksheet worksheet;
workbook.Worksheets.TryGetWorksheet(sheetName, out worksheet);
worksheet. /How to Save it as CSV?
答案 0 :(得分:7)
如果单元格具有分隔符,则其他答案将无法生成有效的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 的回答
答案 1 :(得分:3)
不,直接在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>()))
));
答案 2 :(得分:0)
错误
row.LastCellUsed(false)
这不是csv的正确格式。最后一列将为空而不是获取相对分隔符。
答案 3 :(得分:0)
正如@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>()))
));