Syncfusion Xlsio读取Excel文本列时1,4被转为1.4的问题求助
解决方案:Syncfusion Xlsio v18 读取Excel文本列保留"1,4"原样
问题原因
Excel常规格式会自动将符合数字规则的字符串(比如"1,4",在部分区域设置中逗号被识别为小数分隔符)解析为数字;而"1,2,3"因无法被解析为有效数字,会保留文本格式。Syncfusion Xlsio默认遵循Excel的解析逻辑,导致"1,4"被转换为1.4。
方法1:打开Excel时禁用数字解析
通过ExcelOpenOptions配置不自动解析数字,强制所有内容按文本读取:
ExcelEngine excelEngine = new ExcelEngine(); IApplication excelApp = excelEngine.Excel; excelApp.DefaultVersion = ExcelVersion.Excel2016; // 配置打开选项,禁用数字自动解析 ExcelOpenOptions openOpts = new ExcelOpenOptions(); openOpts.ParseOptions.ParseNumbers = false; // 打开目标工作簿 IWorkbook workbook = excelApp.Workbooks.Open(@"你的文件路径.xlsx", openOpts); IWorksheet worksheet = workbook.Worksheets[0]; // 导出到DataTable DataTable dataTable = worksheet.ExportDataTable(worksheet.UsedRange, ExcelExportDataTableOptions.ColumnNames); // 后续处理逻辑 workbook.Close(); excelEngine.Dispose();
方法2:导出DataTable时指定列数据类型
如果仅需特定列保留文本格式,可通过ImportDataTableOptions明确指定对应列的类型为string:
ExcelEngine excelEngine = new ExcelEngine(); IApplication excelApp = excelEngine.Excel; excelApp.DefaultVersion = ExcelVersion.Excel2016; IWorkbook workbook = excelApp.Workbooks.Open(@"你的文件路径.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; // 创建导入配置选项 ImportDataTableOptions importOpts = new ImportDataTableOptions(); importOpts.StartRow = 1; // 表头所在行 importOpts.StartColumn = 1; importOpts.EndRow = worksheet.UsedRange.LastRow; importOpts.EndColumn = worksheet.UsedRange.LastColumn; // 指定各列数据类型,示例中第2列(索引1)为目标文本列 // 其他列可根据实际需求设置类型,如typeof(int)、typeof(DateTime)等 importOpts.ColumnDataTypes = new Type[] { typeof(string), typeof(string), typeof(int) }; // 导出DataTable DataTable dataTable = worksheet.ExportDataTable(importOpts); // 后续处理逻辑 workbook.Close(); excelEngine.Dispose();
方法3:循环读取单元格文本
如果上述方法无效,直接遍历单元格读取Text属性(需配合方法1禁用数字解析,确保获取原始输入内容):
ExcelEngine excelEngine = new ExcelEngine(); IApplication excelApp = excelEngine.Excel; excelApp.DefaultVersion = ExcelVersion.Excel2016; IWorkbook workbook = excelApp.Workbooks.Open(@"你的文件路径.xlsx"); IWorksheet worksheet = workbook.Worksheets[0]; DataTable dataTable = new DataTable(); int lastCol = worksheet.UsedRange.LastColumn; int lastRow = worksheet.UsedRange.LastRow; // 添加表头 for (int col = 1; col <= lastCol; col++) { dataTable.Columns.Add(worksheet.Cells[1, col].Text); } // 逐行读取数据 for (int row = 2; row <= lastRow; row++) { DataRow dr = dataTable.NewRow(); for (int col = 1; col <= lastCol; col++) { // 读取单元格显示文本,保留原始格式 dr[col - 1] = worksheet.Cells[row, col].Text; } dataTable.Rows.Add(dr); } // 后续处理逻辑 workbook.Close(); excelEngine.Dispose();
注意:如果源Excel中"1,4"已被自动转换为数字(单元格格式为数字),仅读取
Text属性会得到"1.4",此时必须使用方法1禁用数字解析,才能获取原始输入的"1,4"。
内容的提问来源于stack exchange,提问作者Argha
相关产品推荐
相关产品推荐

