仟仞 发表于 2025-8-1 12:41:27

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]
查看完整版本: Excel: xls与xlsx格式转换排坑指南