【发布时间】:2021-12-09 00:10:25
【问题描述】:
我有一个场景,我需要在 Net core 3.1 应用程序中将 MS Excel 文件转换为 .CSV 格式。 Excel文件中的数据不是表格格式,有些地方合并了单元格或者一些表头信息,然后是表格数据。
我尝试使用 ClosedXMl 读取该数据并将其放入 DataTable 中,但它的处理方式有所不同,因为最初的几行与导致修剪几列的其余数据不一致。
我的 Excel 看起来像
这里,前 2 行仅跨越 3 列。
以下是我使用 closedXML 的代码。
public static DataTable GetData(string filename)
{
DataTable dt = new DataTable();
//Open the Excel file using ClosedXML.
using (XLWorkbook workBook = new XLWorkbook(filename))
{
//Read the first Sheet from Excel file.
IXLWorksheet workSheet = workBook.Worksheet(1);
//Create a new DataTable.
//Loop through the Worksheet rows.
int rowsToSkip = 1;
foreach (IXLRow row in workSheet.Rows())
{
var cellsCount = row.Cells().Count();
////Use the first row to add columns to DataTable.
if (rowsToSkip <= 3)
{
foreach (IXLCell cell in row.Cells())
{
if (!string.IsNullOrEmpty(cell.Value.ToString()))
{
dt.Columns.Add(cell.Value.ToString());
}
else
{
break;
}
}
}
else
{
int i = 0;
DataRow toInsert = dt.NewRow();
foreach (IXLCell cell in row.Cells())
{
try
{
toInsert[i] =Convert.ToString(cell.Value);
}
catch (Exception ex)
{
//Handle this, or don't.
}
i++;
}
dt.Rows.Add(toInsert);
}
rowsToSkip++;
}
return dt;
}
}
public static void ToCSV(DataTable dtDataTable, string strFilePath)
{
StreamWriter sw = new StreamWriter(strFilePath, false);
//headers
for (int i = 0; i < dtDataTable.Columns.Count; i++)
{
sw.Write(dtDataTable.Columns[i]);
if (i < dtDataTable.Columns.Count - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
foreach (DataRow dr in dtDataTable.Rows)
{
for (int i = 0; i < dtDataTable.Columns.Count; i++)
{
if (!Convert.IsDBNull(dr[i]))
{
string value = dr[i].ToString();
if (value.Contains(','))
{
value = String.Format("\"{0}\"", value);
sw.Write(value);
}
else
{
sw.Write(dr[i].ToString());
}
}
if (i < dtDataTable.Columns.Count - 1)
{
sw.Write(",");
}
}
sw.Write(sw.NewLine);
}
sw.Close();
}
在 GetData() 中,它只在数据表中创建 3 列,因为初始行仅跨越 3 列。
当我可以将非结构化数据放入数据表并写入 CSV 时,我非常感谢处理这种情况的任何输入。我也对 EPPlus 4.5 或类似的其他开源软件包持开放态度。
【问题讨论】:
标签: c# excel .net-core epplus closedxml