使用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);
关键修改说明
- 分离表头与数据逻辑:在读取数据行前,先通过
rdr.GetName()获取列名并写入Excel第1行 - 调整行索引:表头写完后行索引加1,确保数据从第2行开始写入,避免覆盖表头
- 移除无用代码:删除了每次循环新建的
columns列表(未被使用)和多余的con.Close()调用 - 优化变量命名:将
i/j改为rowIndex/colIndex,提升代码可读性
内容的提问来源于stack exchange,提问作者user838691
相关产品推荐
相关产品推荐

