前言
总结一下在把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, 此时需要一个正则,来识别和修正这个换行:
[code]case "TEXT": string escaped = Regex.Replace(cellValue.ToString().Replace("'", "''"), @"(? |