You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Windows窗体应用导出基于服务的SQL表至Excel?

解决基于服务的SQL数据库表导出到Excel的问题

嘿,我明白你的困扰——基于服务的SQL数据库看起来有点特殊,但其实导出逻辑和常规SQL Server是相通的,而且结合你现有用DataSet操作数据的方式,我们可以很轻松地实现导出。下面给你一步步来实现产品表的Excel导出,你可以直接复用这个逻辑到订单和销售表上:

准备工作:安装Excel操作库

首先,我们需要一个好用的Excel操作工具,推荐用EPPlus——它免费、轻量,不需要用户安装Excel客户端就能操作xlsx文件。你可以通过NuGet安装:

  • 在项目上右键 → 「管理NuGet程序包」
  • 搜索「EPPlus」并安装最新稳定版

完善导出按钮的代码

替换你现有导出按钮的代码,下面是针对产品表的完整实现:

Try
    sfdProdutos.InitialDirectory = "c:\"
    sfdProdutos.Title = "保存Excel文件"
    sfdProdutos.Filter = "Excel文件 (*.xlsx)|*.xlsx" ' 限定保存格式为xlsx
    If sfdProdutos.ShowDialog() = DialogResult.OK Then
        ' 1. 从你的DataSet中获取产品表数据(和你保存数据用的DataSet一致)
        Dim productTable As DataTable = Me.ProdutosDataSet.Tables("Products") ' 注意表名要和DataSet里的一致

        ' 2. 使用EPPlus写入Excel
        Using package As New ExcelPackage(New FileInfo(sfdProdutos.FileName))
            ' 创建名为「产品列表」的工作表
            Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets.Add("产品列表")
            
            ' 3. 写入表头
            For col As Integer = 0 To productTable.Columns.Count - 1
                worksheet.Cells(1, col + 1).Value = productTable.Columns(col).ColumnName
                ' 给表头加粗,方便区分
                worksheet.Cells(1, col + 1).Style.Font.Bold = True
            Next

            ' 4. 写入所有数据行
            For row As Integer = 0 To productTable.Rows.Count - 1
                For col As Integer = 0 To productTable.Columns.Count - 1
                    worksheet.Cells(row + 2, col + 1).Value = productTable.Rows(row)(col)
                Next
            Next

            ' 5. 自动调整列宽,让内容更美观
            worksheet.Cells.AutoFitColumns()

            ' 6. 保存文件
            package.Save()
        End Using

        MessageBox.Show("产品数据导出成功!", "导出完成", MessageBoxButtons.OK)
    End If
Catch ex As Exception
    MessageBox.Show($"导出出错:{ex.Message}", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

关键细节说明

  1. 复用现有DataSet:你保存数据时用的是ProdutosDataSet,直接从这里取表数据是最适配你现有代码的方式,完全不需要处理数据库连接字符串的问题——这也是为什么之前网上针对SQL Server的示例对你没用,那些示例大多是直接写SQL查询,而你用的是TableAdapter+DataSet的模式。
  2. 适配其他表:如果要导出订单或销售表,只需要把productTable换成对应的Me.ProdutosDataSet.Tables("Orders")(假设订单表名是Orders),然后修改工作表名称即可。
  3. 写入现有Excel文件:如果你想写入到已存在的Excel模板里,只需要修改ExcelPackage的初始化方式:
' 打开已有的Excel文件
Using package As New ExcelPackage(New FileInfo("你的模板文件路径.xlsx"))
    ' 获取指定工作表(比如第一个工作表)
    Dim worksheet As ExcelWorksheet = package.Workbook.Worksheets(1)
    ' 注意:这里要从模板的空白行开始写入,避免覆盖原有内容,比如从第5行开始:
    ' For row As Integer = 0 To productTable.Rows.Count - 1
    '     For col As Integer = 0 To productTable.Columns.Count - 1
    '         worksheet.Cells(row + 5, col + 1).Value = productTable.Rows(row)(col)
    '     Next
    ' Next
    package.Save()
End Using

这样就能完美适配你的需求啦,试试吧!

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

火山引擎 最新活动