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

使用SQLiteDataReader导出带表头Excel失败,求助排查代码错误

问题原因与修正方案

你的核心问题是列名处理逻辑完全错误:

  • 你把列名读取放在了rdr.Read()循环内部(每读一行数据就重复读一遍列名),且从未将列名写入Excel表头行
  • 数据行从第1行开始写入,直接覆盖了本该存放表头的位置

修正后的代码

Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = xlWorkBook.Worksheets[1];
xlWorkSheet.Name = "Stats";

string cs = @"C:\\db_test\\Database.db";
string data = String.Empty;

int rowIndex = 1; // 表头从第1行开始
int colIndex = 0;

using (SQLiteConnection con = new SQLiteConnection("Data Source=C:\\db_test\\Database.db"))
{
    con.Open();

    StringBuilder query = new StringBuilder();
    query.Append("SELECT");
    query.Append("[Oid], [CreatedOn], [OrderOid] ");
    query.Append(",[OrderLineOid], [OrderNumber], [Product] ");
    query.Append(",[PaperTypeName], [OutputProfile], [OutputProfileChannel] ");
    query.Append("FROM Stats");

    using (SQLiteCommand cmd = new SQLiteCommand(query.ToString(), con))
    {
        using (SQLiteDataReader rdr = cmd.ExecuteReader())
        {
            // 第一步:写入表头
            for (colIndex = 0; colIndex < rdr.FieldCount; colIndex++)
            {
                xlWorkSheet.Cells[rowIndex, colIndex + 1] = rdr.GetName(colIndex);
            }
            rowIndex++; // 表头写完,数据从下一行开始

            // 第二步:读取并写入数据行
            while (rdr.Read())
            {
                for (colIndex = 0; colIndex < rdr.FieldCount; colIndex++)
                {
                    data = rdr.GetValue(colIndex).ToString();
                    xlWorkSheet.Cells[rowIndex, colIndex + 1] = data;
                }
                rowIndex++;
            }
        }
    }
    // using块会自动关闭连接,无需手动调用Close
}

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Statictics_" + DateTime.Now.ToString("yyyyMMdd") + ".xls";

xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();

releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);

关键修改说明

  1. 分离表头与数据逻辑:在读取数据行前,先通过rdr.GetName()获取列名并写入Excel第1行
  2. 调整行索引:表头写完后行索引加1,确保数据从第2行开始写入,避免覆盖表头
  3. 移除无用代码:删除了每次循环新建的columns列表(未被使用)和多余的con.Close()调用
  4. 优化变量命名:将i/j改为rowIndex/colIndex,提升代码可读性

内容的提问来源于stack exchange,提问作者user838691

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:19