强制 EPPLUS 以文本形式阅读
Force EPPLUS to read as text
我正在开发一个应用程序来读取 xlsx 文件,进行一些验证并插入数据库。不幸的是,当我尝试读取标记为数字的列(带有 EAN-13 代码的 fe)时,我得到了一个 int 的最小值。
用户看不到它,因为 Excel 正确显示它。
如何让它以纯文本格式读取文件?我知道我可以使用 OLEBD,但我还需要动态编辑文件,所以 epplus ExcelPackage 是最好的选择。
这是我使用的代码:
FileInfo file = new FileInfo(path);
MainExcel = new OfficeOpenXml.ExcelPackage(file);
{
var ws = MainExcel.Workbook.Worksheets.First();
DataTable tbl = new DataTable();
for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++) //currently loading all file
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var row = tbl.NewRow();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
}
这就是我枚举列的方式
foreach (var firstRowCell in ws.Cells[3, 1, 3, ws.Dimension.End.Column])
{
System.Type typeString = System.Type.GetType("System.String") ;
tbl.Columns.Add( firstRowCell.Text , typeString );
}
对于可能关心的人,这里是文件(也适用于非 google 用户):
https://drive.google.com/open?id=0B3kIzUcpOx-iMC1iY0VoLS1kU3M&authuser=0
我注意到 ExcelRange.value 属性 是一个包含所有未格式化对象的数组。但是一旦你遍历 ExcelRange 中的单元格并请求 cell.Text 属性,它就已经被处理了。尝试修改 ExcelRange 中的 ConditionalFormatting 和 DataValidation 无济于事 (f.e.AddContainsText()) - @EDIT--> 整个 sheet 都没有:-(
我不希望将 ExcelRange.Value 转换为数组,它很丑陋而且非常有条件。
您文件中的单元格自定义格式为分数。你是故意这样做的吗?
无论如何,如果你想保留这种格式,你可以选择使用 cell.Value
或 cell.RichText.Text
来获得你的 13 位数字。
希望对您有所帮助。
显然这是解决方案(虽然不是完整的代码,您必须向数据表添加列)。我在 Epplus 中找不到指定 'no formatting' 的格式字符串,但是这里有。
var ws = MainExcel.Workbook.Worksheets.First();
DataTable tbl = new DataTable();
for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var array = wsRow.Value as object[,];
var row = tbl.NewRow();
int hhh =0;
foreach (var cell in wsRow)
{
cell.Style.Numberformat.Format = "@";
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
我正在开发一个应用程序来读取 xlsx 文件,进行一些验证并插入数据库。不幸的是,当我尝试读取标记为数字的列(带有 EAN-13 代码的 fe)时,我得到了一个 int 的最小值。 用户看不到它,因为 Excel 正确显示它。
如何让它以纯文本格式读取文件?我知道我可以使用 OLEBD,但我还需要动态编辑文件,所以 epplus ExcelPackage 是最好的选择。
这是我使用的代码:
FileInfo file = new FileInfo(path);
MainExcel = new OfficeOpenXml.ExcelPackage(file);
{
var ws = MainExcel.Workbook.Worksheets.First();
DataTable tbl = new DataTable();
for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++) //currently loading all file
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var row = tbl.NewRow();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
}
这就是我枚举列的方式
foreach (var firstRowCell in ws.Cells[3, 1, 3, ws.Dimension.End.Column])
{
System.Type typeString = System.Type.GetType("System.String") ;
tbl.Columns.Add( firstRowCell.Text , typeString );
}
对于可能关心的人,这里是文件(也适用于非 google 用户): https://drive.google.com/open?id=0B3kIzUcpOx-iMC1iY0VoLS1kU3M&authuser=0
我注意到 ExcelRange.value 属性 是一个包含所有未格式化对象的数组。但是一旦你遍历 ExcelRange 中的单元格并请求 cell.Text 属性,它就已经被处理了。尝试修改 ExcelRange 中的 ConditionalFormatting 和 DataValidation 无济于事 (f.e.AddContainsText()) - @EDIT--> 整个 sheet 都没有:-(
我不希望将 ExcelRange.Value 转换为数组,它很丑陋而且非常有条件。
您文件中的单元格自定义格式为分数。你是故意这样做的吗?
无论如何,如果你想保留这种格式,你可以选择使用 cell.Value
或 cell.RichText.Text
来获得你的 13 位数字。
希望对您有所帮助。
显然这是解决方案(虽然不是完整的代码,您必须向数据表添加列)。我在 Epplus 中找不到指定 'no formatting' 的格式字符串,但是这里有。
var ws = MainExcel.Workbook.Worksheets.First();
DataTable tbl = new DataTable();
for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var array = wsRow.Value as object[,];
var row = tbl.NewRow();
int hhh =0;
foreach (var cell in wsRow)
{
cell.Style.Numberformat.Format = "@";
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}