C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]
转自:http://www.cnblogs.com/yfl8910/archive/2012/05/19/2509194.html
作为财务数据核算人员,面对大量的业务与财务数据,借助于传统的EXCEL表格,已经力不从心。最近几个月,利用周末及下班的空闲时间,写了一个数据库导入导出工具,以方便业务逻辑密集型的数据处理。目前,DataPie支持百万级别的数据导出,对于几十万的数据导入,也轻松应付。
源码及安装包下载地址:https://github.com/yfl8910/DataPie
先看看界面,登录界面:
主界面:
主要代码:
1.把excel文件读到DataTable
///<summary> ///根据excel路径和sheet名称,返回excel的DataTable ///</summary> public static DataTable GetExcelDataTable(string path, string tname) { /*Office 2007*/ string ace = "Microsoft.ACE.OLEDB.12.0"; /*Office 97 - 2003*/ string jet = "Microsoft.Jet.OLEDB.4.0"; string xl2007 = "Excel 12.0 Xml"; string xl2003 = "Excel 8.0"; string imex = "IMEX=1"; /* csv */ string text = "text"; string fmt = "FMT=Delimited"; string hdr = "Yes"; string conn = "Provider={0};Data Source={1};Extended Properties=\"{2};HDR={3};{4}\";"; string select = string.Format("SELECT * FROM [{0}$]", tname); //string select = sql; string ext = Path.GetExtension(path); OleDbDataAdapter oda; DataTable dt = new DataTable("data"); switch (ext.ToLower()) { case ".xlsx": conn = String.Format(conn, ace, Path.GetFullPath(path), xl2007, hdr, imex); break; case ".xls": conn = String.Format(conn, jet, Path.GetFullPath(path), xl2003, hdr, imex); break; case ".csv": conn = String.Format(conn, jet, Path.GetDirectoryName(path), text, hdr, fmt); //sheet = Path.GetFileName(path); break; default: throw new Exception("File Not Supported!"); } OleDbConnection con = new OleDbConnection(conn); con.Open(); //select = string.Format(select, sql); oda = new OleDbDataAdapter(select, con); oda.Fill(dt); con.Close(); return dt; }
2.批量把数据导入到数据库
1)SQL SERVER版本
public bool SqlBulkCopyImport(IList<string> maplist, string TableName, DataTable dt) { using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = TableName; foreach (string a in maplist) { bulkCopy.ColumnMappings.Add(a, a); } try { bulkCopy.WriteToServer(dt); return true; } catch (Exception e) { throw e; } } } }
2)oracle版本
public bool SqlBulkCopyImport(IList<string> maplist, string TableName, DataTable dt) { using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connection)) { bulkCopy.DestinationTableName = TableName; foreach (string a in maplist) { bulkCopy.ColumnMappings.Add(a, a); } try { bulkCopy.WriteToServer(dt); return true; } catch (Exception e) { throw e; } } } }
3)ACCESS版本
public bool SqlBulkCopyImport(IList<string> maplist, string TableName, DataTable dt) { try { using (OleDbConnection connection = new OleDbConnection(connectionString)) { connection.Open(); OleDbDataAdapter adapter = new OleDbDataAdapter("select * from " + TableName + " where 1=0", connection); OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); int rowcount = dt.Rows.Count; for (int n = ; n < rowcount; n++) { dt.Rows[n].SetAdded(); } //adapter.UpdateBatchSize = 1000; adapter.Update(dt); } return true; } catch (Exception e) { throw e; } }
3.导出EXCEL文件
///<summary> ///保存excel文件,覆盖相同文件名的文件 ///</summary> public static bool SaveExcel(string SheetName, DataTable dt, ExcelPackage package) { try { ExcelWorksheet ws = package.Workbook.Worksheets.Add(SheetName); ws.Cells["A1"].LoadFromDataTable(dt, true); return true; } catch (Exception ex) { throw ex; } } ///<summary> ///多个表格导出到一个excel工作簿 ///</summary> public static void export(IList<string> SheetNames, string filename, DBConfig db, IList<string> sqls) { DataTable dt = new DataTable(); FileInfo newFile = new FileInfo(filename); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(filename); } using (ExcelPackage package = new ExcelPackage(newFile)) { for (int i = ; i < sqls.Count; i++) { dt = db.DB.ReturnDataTable(sqls[i]); SaveExcel(SheetNames[i], dt, package); } package.Save(); } } ///<summary> ///单个表格导出到一个excel工作簿 ///</summary> public static void export(string SheetName, string filename, DBConfig db, string sql) { DataTable dt = new DataTable(); FileInfo newFile = new FileInfo(filename); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(filename); } using (ExcelPackage package = new ExcelPackage(newFile)) { dt = db.DB.ReturnDataTable(sql); SaveExcel(SheetName, dt, package); package.Save(); } } ///<summary> ///单个表导出到多个excel工作簿(分页) ///</summary> public static void export(string SheetName, string filename, DBConfig db, string sql, int num, int pagesize) { DataTable dt = new DataTable(); FileInfo newFile = new FileInfo(filename); int numtb = num / pagesize + ; for (int i = ; i <= numtb; i++) { string s = filename.Substring(, filename.LastIndexOf(".")); StringBuilder newfileName = new StringBuilder(s); newfileName.Append(i + ".xlsx"); newFile = new FileInfo(newfileName.ToString()); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(newfileName.ToString()); } using (ExcelPackage package = new ExcelPackage(newFile)) { dt = db.DB.ReturnDataTable(sql, pagesize * (i - ), pagesize); SaveExcel(SheetName, dt, package); package.Save(); } } }
4.DataPie下载地址
https://github.com/yfl8910/DataPie
C#开发的高性能EXCEL导入、导出工具DataPie(支持MSSQL、ORACLE、ACCESS,附源码下载地址)[转]的更多相关文章
- arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- Excel导入导出工具(简单、好用且轻量级的海量Excel文件导入导出解决方案.)
Excel导入导出工具(简单.好用且轻量级的海量Excel文件导入导出解决方案.) 置顶 2019-09-07 16:47:10 $9420 阅读数 261更多 分类专栏: java 版权声明:本 ...
- 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...
- openlayers4 入门开发系列之地图导航控件篇(附源码下载)
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
- openlayers5-webpack 入门开发系列结合 echarts4 实现散点图(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
随机推荐
- 优先队列求解Huffman编码 c++
优先队列小析 优先队列的模板: template <class T, class Container = vector<T>,class Compare = less< ...
- C#按需序列化对象为Json字符串
只贴代码,不解释了.新的代理类型确实很给力! public static class JsonHelper { public static string ToJsonString<T>(I ...
- 解决play-1.4.0在linux或mac下提示No such file or directory的问题
问题原因:"play"脚本中有特殊符号. 解决方案:写脚本去掉即可. 代码:fixplay.py 放在play-1.4.0目录下执行.亲测在osx与ubuntu下均可用. with ...
- 图解 & 深入浅出Java初始化与清理:构造器必知必会
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 并行编程多线程之Parallel
1.简介 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threadin ...
- WinStore控件之TextBlock
1 TextBlock简单实例应用 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}&quo ...
- 译:在C#中使用LINQ To SQL
译文出处:http://www.codeproject.com/Tips/871938/LINQ-To-SQL-Using-Csharp 今天在这个话题中,我给大家分享一个在c#编程中非常有趣和十分有 ...
- 浅析MongoDB数据库的海量数据存储应用
[摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...
- [原]零基础学习在Android进行SDL开发系列文章
[原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...
- java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库
JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...