Excel: xls与xlsx格式转换排坑指南
前言总结一下在把Excel 5.0/95 的XLS转换为Excel 2007的XLSX新格式遇到的问题。
数据类型匹配
XLS文件里的单元格是General类型,但在XLSX里,是有针对具体的列设置数据类型的,这使得在操作database时,有可能造成数据类型不一致的错误:
string type = string.Empty;
if (!dict.TryGetValue(field, out type))
{
return "TEXT";
}
switch (type.ToUpper())
{
case "C":
case "L": // Bit(Logic) treat as Text
return "TEXT";
case "I":
return "INTEGER";
case "B":
case "F":
case "N":
case "Y":
return "DOUBLE";
case "D":
case "T":
return "DATETIME";
default:
return "TEXT";
}再者就是对于空串和Null,似乎xls认为没有什么差异,但xlsx读取出来,倘若单元格没有内容,""和DB.Null是有差异的:
if (cellValue == DBNull.Value || cellValue == null)
{
if ((sheetName.Equals("sheet1", StringComparison.OrdinalIgnoreCase) || sheetName.Equals("sheet2", StringComparison.OrdinalIgnoreCase)) &&
(columnName.Equals("date_from", StringComparison.OrdinalIgnoreCase) || columnName.Equals("date_to", StringComparison.OrdinalIgnoreCase)))
{
values += "'" + new string(' ', 16) + "',";
}
else
{
values += "NULL,";
}
continue;}
内容多行时处理不同
但单元格内容有多行时,xls认为换行是:CR+LF,xlsx则只有LF, 此时需要一个正则,来识别和修正这个换行:
case "TEXT": string escaped = Regex.Replace(cellValue.ToString().Replace("'", "''"), @"(?
页:
[1]