C#用OLEDB转换Excel .xlsx列到JSON是否最优?及报错咨询
Excel经纬度转指定JSON格式的问题与解决
核心需求
我在Excel中有已填充数据的Latitude(纬度)和Longitude(经度)两列,希望将每行的这两列合并并转换为如下格式的JSON:
"{\"Locations\" : [[50.452603, 30.522025],[30.621929, 31.012975]]}"
原本考虑用OLEDB DataAdapter填充DataTable实现,但相关示例多针对.xls文件,我用的是较新的.xlsx格式,想确认这是否仍是最优方案?
遇到的错误与问题代码
尝试以下代码时出现两个错误:
System.Data.OleDb.OleDbException: 'Cannot update. Database or object is read-only.'dataGridView1.DataBind()提示无此定义。
问题代码:
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + "A:\\Home\\Test.xlsx;" + "Extended Properties=Excel 8.0;"; OleDbConnection objConn = new OleDbConnection(sConnectionString); objConn.Open(); OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM MyRange1", objConn); OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(); objAdapter1.SelectCommand = objCmdSelect; DataSet objDataset1 = new DataSet(); objAdapter1.Fill(objDataset1, "XLData"); dataGridView1.DataSource = objDataset1.Tables[0].DefaultView; dataGridView1.DataBind(); objConn.Close();
错误修复与方案选择
1. 现有代码错误修复
- 连接字符串适配.xlsx:
Microsoft.Jet.OLEDB.4.0仅支持旧版.xls,.xlsx需使用Microsoft.ACE.OLEDB.12.0驱动,同时调整Extended Properties参数。修正后的连接字符串:
说明:String sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=A:\\Home\\Test.xlsx;" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";";HDR=YES表示第一行是列名;IMEX=1强制以读取模式处理混合数据类型,避免只读报错。 - 移除无效的DataBind()调用:WinForms的
DataGridView设置DataSource后会自动绑定数据,直接删除dataGridView1.DataBind()这行代码即可。
2. OLEDB是否为.xlsx的最优方案?
不是。OLEDB存在以下局限:
- 依赖ACE驱动,用户机器未安装时需额外部署;
- 对Excel复杂格式、公式的支持有限;
- 性能和易用性不如专门的Excel处理库。
更推荐使用EPPlus或NPOI这类开源库:
- EPPlus:适用于.NET Core/.NET 5+,API简洁,直接操作单元格,无需额外驱动;
- NPOI:兼容.NET Framework和.NET Core,同时支持.xls和.xlsx格式。
3. 用EPPlus实现JSON转换的示例代码
using OfficeOpenXml; using System.Collections.Generic; using System.IO; using System.Text.Json; // 设置EPPlus许可(商业用途需购买授权) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; string filePath = @"A:\Home\Test.xlsx"; List<List<double>> locations = new List<List<double>>(); using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath))) { ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; // 替换为你的工作表名称 int rowCount = worksheet.Dimension.Rows; // 从第二行开始读取(假设第一行是列名) for (int row = 2; row <= rowCount; row++) { double latitude = worksheet.Cells[row, 1].GetValue<double>(); // 纬度列对应第1列 double longitude = worksheet.Cells[row, 2].GetValue<double>(); // 经度列对应第2列 locations.Add(new List<double> { latitude, longitude }); } } // 转换为目标JSON结构 var jsonObj = new { Locations = locations }; string rawJson = JsonSerializer.Serialize(jsonObj); // 处理为示例中的带转义和外层引号的格式 string formattedJson = $"\"{rawJson.Replace("\"", "\\\"")}\";";
内容的提问来源于stack exchange,提问作者CGarden
相关产品推荐
相关产品推荐

