You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:33:12