输出到 Excel 的 C# SQL 查询,但输出中不包括新添加的字段



我有一个小的按钮单击代码,它将SQL查询输出到Excel。

这工作正常,直到我在它查询的表中添加了一个新字段,现在它仍然输出相同的字段,不包括新字段。

法典:

private void button4_Click(object sender, EventArgs e)
{
string SQLQuery = "SELECT * FROM Services";
SqlConnection conn = new SqlConnection("CONNECTION STRING");
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(SQLQuery, conn);
da.Fill(ds);
Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
Workbook ExcelWorkBook = null;
Worksheet ExcelWorkSheet = null;
ExcelApp.Visible = true;
ExcelApp.WindowState = XlWindowState.xlMinimized;
ExcelApp.WindowState = XlWindowState.xlMaximized;
ExcelWorkBook = ExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
List<string> SheetNames = new List<string>();
SheetNames.Add("Services Details");
ExcelApp.ActiveWindow.Activate();
try
{
for (int i = 1; i < ds.Tables.Count; i++)
ExcelWorkBook.Worksheets.Add();
for (int i = 0; i < ds.Tables.Count; i++)
{
int r = 1;
ExcelWorkSheet = ExcelWorkBook.Worksheets[i + 1];
ExcelWorkSheet.Name = "Services";
for (int col = 1; col < ds.Tables[i].Columns.Count; col++)
ExcelWorkSheet.Cells[r, col] = ds.Tables[i].Columns[col - 1].ColumnName;
r++;
for (int row = 0; row < ds.Tables[i].Rows.Count; row++)
{
for (int col = 1; col < ds.Tables[i].Columns.Count; col++)
ExcelWorkSheet.Cells[r, col] = ds.Tables[i].Rows[row][col - 1].ToString();
r++;
}
ExcelWorkSheet.Rows[1].EntireRow.Font.Bold = true;
ExcelApp.Columns.AutoFit();
}
ExcelApp.Quit();
Marshal.ReleaseComObject(ExcelWorkSheet);
Marshal.ReleaseComObject(ExcelWorkBook);
Marshal.ReleaseComObject(ExcelApp);
}
catch (Exception exHandle)
{
Console.WriteLine("Exception: " + exHandle.Message);
Console.ReadLine();
}
}

我还尝试显式查询新字段SELECT ABC FROM Services,但没有输出任何内容。

新字段中有值。

如果我在 Azure 查询编辑器预览版上运行相同的查询,我会得到正确的结果。

编辑

好的,所以我将查询更改为SELECT *,1 FROM Services然后我获取所有字段(禁止新的"1"字段(如何更改循环以获取所有字段?

编辑 2 使用 EPPlus 的解决方案

只是为了更新将来看到这个的人,我使用了NuGet Package Manager(Project>Manage NuGet Packages(并由Jan Kallmän安装EPPlus

然后我补充说:

using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Data.SqlClient;
using System.IO;

并在按钮上使用以下代码:

private void button4_Click(object sender, EventArgs e)
{
string SQLQuery = "SELECT * FROM Services";
SqlConnection conn = new SqlConnection("CONNECTION STRING");
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(SQLQuery, conn);
DataTable dt = new DataTable();
da.Fill(dt);
using (var p = new ExcelPackage())
{
var ws = p.Workbook.Worksheets.Add("Service");
ws.Cells["A1"].LoadFromDataTable(dt, true);
int totalRows = ws.Dimension.End.Row;
int totalCols = ws.Dimension.End.Column;
var headerCells = ws.Cells[1, 1, 1, totalCols];
var headerFont = headerCells.Style.Font;
headerFont.Bold = true;
var allCells = ws.Cells[1, 1, totalRows, totalCols];
allCells.AutoFitColumns();
p.SaveAs(new FileInfo(@"d:excelService" + DateTime.Now.ToFileTime() + ".xlsx"));
}
}

这是文件的即时输出,感谢@Caius Jard

首先,我支持关于使用 EPPlus 的评论。我认为它甚至有一种将数据表转换为工作表的方法,因此这个单击事件处理程序可以归结为大约 4 行代码。看看这个SO问题 - 导出数据表以超越EPPlus

其次,我认为您的实际问题是一个简单的错误

你说(我的释义(

如果我使用返回一列的查询,例如select abc from services,则不会输出任何内容

以下是您执行列输出的方式:

for(int col = 1; col < table.Columns.Count; col++)

您的表有一列。因此,运行循环的比较是:is 1 less than 1?

循环不运行

如果表有 10 列,则循环将运行 9 次。最后一列永远不会输出。你有一个查询,末尾有一个新列,你希望看到它,它不存在是因为你的 c# 没有输出它,而不是因为列中的数据有些奇怪。

就如何处理它而言,更改您在"应该循环运行"部分中所做的比较:

for(int col = 1; col <= table.Columns.Count; col++)

或者更改索引方式(索引为 0 而不是索引 1(:

for(int col = 0; col < table.Columns.Count; col++)
excel[row, col+1] = table[row][col]; //excel is 1 based, c# is 0 based

关于"但是数据没有改变,代码没有改变,观察到不同的东西"的概念 - 几乎从来没有这种情况。更有可能的是,等式中的人类忘记了某些东西。也许第一个编写代码的人遇到了同样的问题,只是复制了SQL中的最后一列来解决它,然后你/其他人看到了它,虽然"这看起来不对,我会把它拿出来......",然后几个月后你正在寻找并去"这曾经有效,我敢肯定它确实......">

:)

但说真的;使用EPPlus;)它令人愉快,简单,直接创建XLSX文件(它们只是zip中的XML文件,重命名为XLSX(,并且非常简单。Excel COM是一个非常令人头疼的问题,您将不必要地为自己构建技术支持噩梦。使用 EPPlus(使用 nuget 包管理器添加对 EPPlus 的引用(,您的代码将更像:

using(SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM services", "PUT YOUR CONN STRING IN A CONFIG FILE")){
DataTable dt = new DataTable();
da.Fill(dt);
using (ExcelPackage ep = new ExcelPackage(newFile))
{
ExcelWorksheet ws = ep.Workbook.Worksheets.Add("Sheetname");
ws.Cells["A1"].LoadFromDataTable(dt, true);
ep.SaveAs(new FileInfo("YOUR SAVE PATH HERE"));
}
}

"服务"是表还是视图?您可能会看到来自过时架构(在进行更改之前缓存(的结果。这是"选择 *"的危险。尝试使用显式字段列表而不是"*"。

最新更新