C#导出数据库到Excel文件(.NET)

news2025/1/11 8:04:21

随着企业业务的增长和复杂性的增加,对数据进行有效的分析、共享和报告变得至关重要;而Excel,作为一款广泛接受的数据处理工具,提供了强大的计算能力、可视化选项以及与多种数据分析工具的兼容性,使得它成为从数据库导出数据的理想选择。通过利用C#编程语言的强大特性和丰富的.NET库支持,开发人员不仅能够高效地完成从数据库到Excel文件的数据迁移,还可以根据特定业务逻辑定制导出过程,确保数据的准确性和完整性,同时提升用户体验并满足不同用户的报表需求。
本文将介绍如何在.NET平台使用C#代码导出数据库数据到Excel文件

文章目录

    • 导出SQLite数据库到Excel文件
    • 导出Access数据库到Excel文件

本文所使用的方法需要用到,免费的Free Spire.XLS for .NET,以及System.Data.SQLite和System.Data.OleDb。NuGet:

PM> Install-Package FreeSpire.XLS
PM> Install-Package System.Data.SQLite
PM> Install-Package System.Data.OleDb

导出SQLite数据库到Excel文件

System.Data.SQLite模块可以直接从SQLite数据库文件中读取数据。读取到数据之后,我们可以使用Free Spire.XLS for .NET创建Excel文件并将数据写入其中。以下是操作步骤及代码示例:

  1. 定义文件路径
    • 设置SQLite数据库文件路径为Sample.db
    • 设置Excel输出文件路径为output/DatabaseToExcel.xlsx
  2. 创建Excel工作簿实例
    • 创建一个新的Workbook实例以表示要导出的Excel文件。
    • 清除默认包含的工作表,确保工作簿为空。
  3. 建立SQLite连接
    • 使用SQLiteConnection类创建一个到SQLite数据库的新连接,并通过提供数据源和版本号来初始化连接字符串。
    • 打开与SQLite数据库的连接。
  4. 获取数据库中的所有表名
    • 通过调用GetSchema("Tables")方法从数据库中获取所有表的名字,并将结果存储在一个DataTable对象中。
  5. 遍历每个表并处理
    • 遍历DataTable对象中的每一行,提取表名。
    • 对于每个表,添加一个新的工作表到Excel工作簿中,并将工作表命名为对应的表名。
  6. 读取表数据并写入Excel
    • 构建SQL查询语句以选择当前表中的所有数据,并使用SQLiteCommand执行此查询。
    • 使用SQLiteDataReader读取查询结果:
      • 获取列名并将它们写入新工作表的第一行。
      • 设置第一行(即标题行)的字体样式为粗体,字号为12。
      • 遍历数据行,将每一行的数据值写入相应的单元格中,同时自动调整每列的宽度以适应内容。
      • 设置数据行的字体大小为11。
  7. 关闭数据库连接
    • 完成所有表的数据读取和写入后,关闭与SQLite数据库的连接。
  8. 保存Excel文件
    • 将生成的工作簿保存到之前定义的Excel文件路径。
    • 释放workbook对象使用的资源。

代码示例

using System.Data;
using System.Data.SQLite;
using Spire.Xls;

namespace SQLiteToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // SQLite数据库路径
            string sqliteFilePath = "Sample.db";

            // Excel文件路径
            string excelFilePath = "output/DatabaseToExcel.xlsx";

            // 创建一个新的工作簿实例
            Workbook workbook = new Workbook();
            // 清除默认的工作表
            workbook.Worksheets.Clear();

            // 创建SQLite连接
            using (SQLiteConnection connection = new SQLiteConnection($"Data Source={sqliteFilePath};Version=3;"))
            {
                connection.Open();

                // 获取所有表名
                DataTable tables = connection.GetSchema("Tables");

                // 遍历每个表
                foreach (DataRow tableRow in tables.Rows)
                {
                    string tableName = tableRow["TABLE_NAME"].ToString();

                    // 创建一个新的工作表
                    Worksheet sheet = workbook.Worksheets.Add(tableName);

                    // 获取表数据
                    string selectQuery = $"SELECT * FROM [{tableName}]";
                    using (SQLiteCommand command = new SQLiteCommand(selectQuery, connection))
                    {
                        using (SQLiteDataReader reader = command.ExecuteReader())
                        {
                            // 获取列名并写入第一行
                            for (int col = 0; col < reader.FieldCount; col++)
                            {
                                sheet.Range[1, col + 1].Value = reader.GetName(col);
                            }
                            // 设置标题行的字体样式
                            sheet.Rows[0].Style.Font.IsBold = true;
                            sheet.Rows[0].Style.Font.Size = 12;

                            // 写入数据行
                            int rowIndex = 2;
                            while (reader.Read())
                            {
                                for (int col = 0; col < reader.FieldCount; col++)
                                {
                                    sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col).ToString();
                                    // 自动调整列宽
                                    sheet.AutoFitColumn(col + 1);
                                }
                                // 设置数据行的字体样式
                                sheet.Rows[rowIndex - 1].Style.Font.Size = 11;
                                rowIndex++;
                            }
                        }
                    }
                }

                connection.Close();
            }

            // 保存Excel文件
            workbook.SaveToFile(excelFilePath);
            workbook.Dispose();
            Console.WriteLine("数据已成功导出到Excel文件!");
        }
    }
}

结果
C#导出SQLite数据库到Excel

导出Access数据库到Excel文件

System.Data.OleDb可以直接读取Access数据库中的数据,我们可以使用同样的方法来导出Access数据库到Excel文件。以下是操作步骤及代码示例:
以下是将提供的C#代码转换为操作步骤的介绍,用于将Access数据库中的数据导出到Excel文件:

  1. 定义文件路径
    • 设置Access数据库文件路径为Database.accdb
    • 设置Excel输出文件路径为output/DatabaseToExcel.xlsx
  2. 创建Excel工作簿实例
    • 创建一个新的Workbook实例以表示要导出的Excel文件。
    • 清除默认包含的工作表,确保工作簿为空。
  3. 定义连接字符串
    • 定义一个连接字符串,用于连接到指定路径的Access数据库。这里使用的是Microsoft.ACE.OLEDB.12.0提供程序,并指定了不持久化安全信息。
  4. 建立OleDb连接
    • 使用OleDbConnection类创建一个新的连接对象,并通过调用Open()方法打开与Access数据库的连接。
  5. 获取所有表名
    • 通过调用GetSchema("Tables")方法从数据库中获取所有表的名字,并将结果存储在一个DataTable对象中。
  6. 遍历每个表并处理(跳过系统表)
    • 遍历DataTable对象中的每一行,提取表名。
    • 跳过非用户定义的表(例如,系统表)。这一步可以通过检查TABLE_TYPE列来完成,只处理类型为TABLE的表。
    • 对于每个用户定义的表,添加一个新的工作表到Excel工作簿中,并将工作表命名为对应的表名。
  7. 读取表数据并写入Excel
    • 构建SQL查询语句以选择当前表中的所有数据,并使用OleDbCommand执行此查询。
    • 使用OleDbDataReader读取查询结果:
      • 获取列名并将它们写入新工作表的第一行。
      • 设置第一行(即标题行)的字体样式为粗体,字号为12。
      • 遍历数据行,将每一行的数据值写入相应的单元格中,同时自动调整每列的宽度以适应内容。
      • 设置数据行的字体大小为11。
  8. 关闭数据库连接
    • 完成所有表的数据读取和写入后,关闭与Access数据库的连接。
  9. 保存Excel文件
    • 将生成的工作簿保存到之前定义的Excel文件路径。
    • 释放workbook对象使用的资源。

代码实例

using System.Data;
using System.Data.OleDb;
using Spire.Xls;

namespace AccessToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // Access数据库路径
            string accessFilePath = "Database.accdb";

            // Excel文件路径
            string excelFilePath = "output/DatabaseToExcel.xlsx";

            // 创建一个新的工作簿实例
            Workbook workbook = new Workbook();
            // 清除默认的工作表
            workbook.Worksheets.Clear();

            // 定义Access数据库的连接字符串
            string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={accessFilePath};Persist Security Info=False;";

            // 创建OleDb连接
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            {
                connection.Open();

                // 获取所有表名
                DataTable tables = connection.GetSchema("Tables");

                // 遍历每个表
                foreach (DataRow tableRow in tables.Rows)
                {
                    // 跳过系统表,您可以在这里添加更多条件
                    if (tableRow["TABLE_TYPE"].ToString() != "TABLE") continue;

                    string tableName = tableRow["TABLE_NAME"].ToString();

                    // 创建一个新的工作表
                    Worksheet sheet = workbook.Worksheets.Add(tableName);

                    // 获取表数据
                    string selectQuery = $"SELECT * FROM [{tableName}]";
                    using (OleDbCommand command = new OleDbCommand(selectQuery, connection))
                    {
                        using (OleDbDataReader reader = command.ExecuteReader())
                        {
                            // 获取列名并写入第一行
                            for (int col = 0; col < reader.FieldCount; col++)
                            {
                                sheet.Range[1, col + 1].Value = reader.GetName(col);
                            }
                            // 设置标题行的字体样式
                            sheet.Rows[0].Style.Font.IsBold = true;
                            sheet.Rows[0].Style.Font.Size = 12;

                            // 写入数据行
                            int rowIndex = 2;
                            while (reader.Read())
                            {
                                for (int col = 0; col < reader.FieldCount; col++)
                                {
                                    sheet.Range[rowIndex, col + 1].Value = reader.GetValue(col)?.ToString() ?? "";
                                    // 自动调整列宽
                                    sheet.AutoFitColumn(col + 1);
                                }
                                // 设置数据行的字体样式
                                sheet.Rows[rowIndex - 1].Style.Font.Size = 11;
                                rowIndex++;
                            }
                        }
                    }
                }

                connection.Close();
            }

            // 保存Excel文件
            workbook.SaveToFile(excelFilePath);
            workbook.Dispose();
            Console.WriteLine("数据已成功导出到Excel文件!");
        }
    }
}

结果
C#导出Access数据库到Excel

本文演示如何在.NET平台使用C#导出数据库到Excel文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java后台实现百度米制坐标转WGS84地理坐标实战

目录 前言 一、需求简介 1、信息查询 二、Java后台转换 1、相关属性 2、相关转换方法 3、实例转换 三、Leaflet可视化 1、准备展示数据 2、Marker标记 3、可视化效果 四、总结 前言 在现代信息技术高速发展的今天&#xff0c;地理信息系统&#xff08;GIS&#xff0…

声音克隆GPT-SoVITS

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS&#xff0c;作为一款结合了GPT&#xff08;生成预训练模型&#xff09;和SoVITS&#xff08;基于变分信息瓶颈技术的歌声转换&#xff09;的创新工具&#xff0c;正在声音克隆领域掀…

自动驾驶数据集的应用与思考

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;是互联网时代的“石油”“煤炭”&#xff0c;掌握数据对于企业而言是能够持续生存和发展的不竭动力&#xff0c;对于需要大量数据训练自动驾驶系统的企业而言更是如此。 而随着激光雷达、毫米波雷…

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域&#xff0c;GPU&#xff08;图形处理单元&#xff09;因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及&#xff0c;越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【力扣】409.最长回文串

问题描述 思路解析 因为同时包含大小写字母&#xff0c;直接创建个ASCII表大小的桶来标记又因为是要回文子串&#xff0c;所以偶数个数的一定可以那么同时&#xff0c;对于出现奇数次数的&#xff0c;我没需要他们的次数-1&#xff0c;变为偶数&#xff0c;并且可以标记出现过…

Linux——管理用户和用户组

一、用户有哪些 root用户 定义&#xff1a;root用户是Linux系统中的最高权限用户&#xff0c;具有对系统所有资源的完全控制权。特性&#xff1a;root用户可以执行系统中的任何操作&#xff0c;包括修改系统配置文件、安装软件、管理系统服务等。由于其拥有最高权限&#xff0c…

SIP系列七:ICE框架(P2P通话)

我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…

Spring Boot如何实现防盗链

一、什么是盗链 盗链是个什么操作&#xff0c;看一下百度给出的解释&#xff1a;盗链是指服务提供商自己不提供服务的内容&#xff0c;通过技术手段绕过其它有利益的最终用户界面&#xff08;如广告&#xff09;&#xff0c;直接在自己的网站上向最终用户提供其它服务提供商的…

5.内容管理模块-课程查询

搞清楚一个项目的业务流程最直接的手段&#xff0c;就是找一个账号登录进去&#xff0c;操作一遍。 3.3设计接口 接口设计分析 post在需要提交很多参数的时候使用&#xff0c;并且post的安全性较高。 接口分析&#xff1a; po包&#xff0c;一般存放和数据库交互的实体类。 …

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一&#xff0c;它为互联网上的数据传输提供了可靠性和连接管理。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议…

vue3组件间传值

definProps方式 子组件&#xff1a;assignSuppliers.vue const propdefineProps({fid:String}); 父组件&#xff1a;index.vue <!-- 供应商分配 --><n-drawerwidth"800"v-model:visible"drawerSupplierConfig.visible":title"drawerSuppli…

《网络安全编程基础》之Socket编程

我的代码 server.c // server.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件 void main(int argc,char* argv[]) {WSADATA …

不只是请求和响应:使用Fiddler解读Cookie与状态码全指南(下)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)_fiddler 获取响应脚本-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5501 不只是请求和响…

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名&#xff1a;某类事物的名…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…