设为首页 收藏本站
查看: 2126|回复: 0

[经验分享] 功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

[复制链接]
YunVN网友  发表于 2015-6-27 08:19:29 |阅读模式
  软件名:DataPie
  功能:支持SQL server、SQLite、ACCESS数据库的导入、导出、存储过程调用,支持EXCEL2007、EXCEL2003、ACCESS2007、 CSV文件导入数据库,支持EXCEL、CSV、ZIP、ACCESS文件方式导出,支持数据拆分导出及自定义SQL查询与导出。
  开发背景:作者从事财务管理工作,主要是出具集团的内部财务报表,随着公司精细化管理的需求,管理报表的数据量急速增长, 依赖EXCEL加工处理数据已经变得极为困难,因此团队全面转向关系数据库进行数据处理,为减少财务人员使用数据库的难度,因此专门针对财务报表核算需要,开发了该工具。目前,我月度报表处理的数据量超过5G,最大的单次运算量记录接近千万,该工具主要发挥的作用就是将收集到的数据, 导入SQL SERVER数据库,进行报表运算,并且输出各类财务报表,对于几十万级的数据输入、输出基本上能够轻松应付。
  源码下载地址:https://github.com/yfl8910/DataPie
  
  软件界面及主要代码:
  1.导入界面,支持EXCEL2007、EXCEL2003、ACCESS2007、 CSV文件导入数据库,支持CSV文件夹整体导入相应表。财务工作的数据源较多,有业务提供的excel数据,也有从系统中取出的csv、excel或者text文档,为满足多种数据源的输入,所以多种数据源导入数据库。目前SQL SERVER导入整体效率较高,ACCESS下,excel文件导入效率最高(几十万的数据量可以很快导入),其他方式效率还有待提升。
DSC0000.jpg
  涉及核心代码如下



  public static DataTable GetDataTableFromFile(string path, string tname)
{
string ace = "Microsoft.ACE.OLEDB.12.0";
string jet = "Microsoft.Jet.OLEDB.4.0";
string xl2007 = "Excel 12.0 Xml";
string xl2003 = "Excel 8.0";
string imex = "IMEX=1";
string hdr = "Yes";
string conn = "Provider={0};Data Source={1};Extended Properties=\"{2};HDR={3};{4}\";";
string select = "";
string ext = Path.GetExtension(path);
OleDbDataAdapter oda;
DataTable dt = new DataTable(tname);
switch (ext.ToLower())
{
case ".xlsx":
conn = String.Format(conn, ace, Path.GetFullPath(path), xl2007, hdr, imex);
select = string.Format("SELECT * FROM [{0}$]", tname);
break;
case ".xls":
conn = String.Format(conn, jet, Path.GetFullPath(path), xl2003, hdr, imex);
select = string.Format("SELECT * FROM [{0}$]", tname);
break;
case ".accdb":
conn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= {0};Persist Security Info=False;", path);
select = string.Format("SELECT * FROM [{0}]", tname);
break;
case ".csv":
conn = String.Format(conn, ace, path.Substring(0, path.LastIndexOf('\\')), "text;Excel 12.0", hdr, imex);
select = string.Format("SELECT * FROM [{0}]", Path.GetFileName(path));
break;
default:
throw new Exception("File Not Supported!");
}
OleDbConnection con = new OleDbConnection(conn);
con.Open();
oda = new OleDbDataAdapter(select, con);
oda.Fill(dt);
con.Close();
return dt;
}
  
  
  2.数据导出界面,支持EXCEL2007、CSV、ACCESS、zip压缩文件、分拆导出几个功能。我目前从事的岗位,报表整体数据量接近千万级,其中单表需要导出分发到业务手中的数据量最大也超过了百万级,目前达到百万级数据量的表导出,一般采用CSV文件或者压缩包的形式,或者分多个表导出。
DSC0001.jpg
  涉及核心代码。excel导出主要源码 :



  public static void SaveExcel(string FileName, string sql, string SheetName)
{
FileInfo newFile = new FileInfo(FileName);
if (newFile.Exists)
{
newFile.Delete();
newFile = new FileInfo(FileName);
}
using (ExcelPackage package = new ExcelPackage(newFile))
{
try
{
ExcelWorksheet ws = package.Workbook.Worksheets.Add(SheetName);
IDataReader reader = DBConfig.db.DBProvider.ExecuteReader(sql);
ws.Cells["A1"].LoadFromDataReader(reader, true);
}
catch (Exception ex)
{
throw ex;
}
package.Save();
}
}
///
/// 工作簿中添加新的SHEET
///
public static bool SaveExcel(ExcelPackage package, string sql, string SheetName)
{
try
{
ExcelWorksheet ws = package.Workbook.Worksheets.Add(SheetName);
IDataReader reader = DBConfig.db.DBProvider.ExecuteReader(sql);
ws.Cells["A1"].LoadFromDataReader(reader, true);
return true;
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 单表格导出到一个EXCEL工作簿
///
public static int ExportExcel(string FileName, string sql, string SheetName)
{
if (FileName != null)
{
Stopwatch watch = Stopwatch.StartNew();
watch.Start();
SaveExcel(FileName, sql, SheetName);
watch.Stop();
return Convert.ToInt32(watch.ElapsedMilliseconds / 1000);
}
return -1;
}
public static async Task ExportExcelAsync(string FileName, string sql, string SheetName)
{
return await Task.Run(
() => { return ExportExcel(FileName,sql,SheetName); }
);
}
///
/// 多表格导出到一个EXCEL工作簿
///
public static int ExportExcel(string[] TabelNameArray, string filename)
{
if (filename != null)
{
Stopwatch watch = Stopwatch.StartNew();
watch.Start();
FileInfo newFile = new FileInfo(filename);
if (newFile.Exists)
{
newFile.Delete();
newFile = new FileInfo(filename);
}

using (ExcelPackage package = new ExcelPackage(newFile))
{
for (int i = 0; i < TabelNameArray.Length; i++)
{
string sql = "select * from  [" + TabelNameArray + "]";
IDataReader reader = DBConfig.db.DBProvider.ExecuteReader(sql);
SaveExcel(package, sql, TabelNameArray);
}
package.Save();
}
watch.Stop();
return Convert.ToInt32(watch.ElapsedMilliseconds / 1000);
}
return -1;
}
public static  async Task ExportExcelAsync(string[] TabelNameArray, string filename) {
return await Task.Run(
() => { return ExportExcel( TabelNameArray,filename); }      
);
}
///
/// 分拆导出
///
public static int ExportExcel(string[] TabelNameArray, string filename, string[] whereSQLArr)
{
if (filename != null)
{
Stopwatch watch = Stopwatch.StartNew();
watch.Start();
FileInfo file = new FileInfo(filename);
int wherecount = whereSQLArr.Length;
int count = TabelNameArray.Length;
for (int i = 0; i < wherecount; i++)
{
string s = filename.Substring(0, filename.LastIndexOf("\\"));
StringBuilder newfileName = new StringBuilder(s);
int index = whereSQLArr.LastIndexOf("=");
string sp = whereSQLArr.Substring(index + 2, whereSQLArr.Length - index - 3);
newfileName.Append("\\" + file.Name.Substring(0, file.Name.LastIndexOf(".")) + "_" + sp + ".xlsx");
FileInfo newFile = new FileInfo(newfileName.ToString());
if (newFile.Exists)
{
newFile.Delete();
newFile = new FileInfo(newfileName.ToString());
}
for (int j = 0; j < count; j++)
{
string sql = "select * from [" + TabelNameArray[j] + "]" + whereSQLArr;
IDataReader reader = DBConfig.db.DBProvider.ExecuteReader(sql);
SaveExcel(newfileName.ToString(), sql, TabelNameArray[j]);
}

}
watch.Stop();
return Convert.ToInt32(watch.ElapsedMilliseconds / 1000);
}
return -1;
}
public static async Task ExportExcelAsync(string[] TabelNameArray, string filename, string[] whereSQLArr)
{
return await Task.Run(
() => { return ExportExcel(TabelNameArray,filename,whereSQLArr); }
);
}
  csv导出主要源码 (其他代码请参github上的源码):



  private static void WriteHeader(IDataReader reader, StreamWriter sw)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (i > 0)
sw.Write(',');
sw.Write(reader.GetName(i));
}
sw.Write(Environment.NewLine);
}
private static void WriteContent(IDataReader reader, StreamWriter sw)
{
for (int i = 0; i < reader.FieldCount; i++)
{
if (i > 0)
sw.Write(',');
String v = reader.ToString();
if (v.Contains(',') || v.Contains('\n') || v.Contains('\r') || v.Contains('"'))
{
sw.Write('"');
sw.Write(v.Replace("\"", "\"\""));
sw.Write('"');
}
else
{
sw.Write(v);
}
}
sw.Write(Environment.NewLine);
}
public static int SaveCsv(IDataReader reader, string filename)
{
Stopwatch watch = Stopwatch.StartNew();
watch.Start();
StreamWriter sw = new StreamWriter(filename, false, Encoding.GetEncoding("gb2312"));
WriteHeader(reader, sw);
while (reader.Read())
{
WriteContent(reader, sw);
}
sw.Flush();
sw.Close();//释放资源

watch.Stop();
return Convert.ToInt32(watch.ElapsedMilliseconds / 1000);
}
public static async Task ExportCsvAsync(IDataReader reader, string filename)
{
return await Task.Run( () => { return SaveCsv( reader,  filename);} );
}
public static StreamWriter GetStreamWriter(string filename, int outCount)
{
string s = filename.Substring(0, filename.LastIndexOf("."));
StringBuilder newfileName = new StringBuilder(s);
newfileName.Append(outCount + 1 + ".csv");
FileInfo newFile = new FileInfo(newfileName.ToString());
if (newFile.Exists)
{
newFile.Delete();
newFile = new FileInfo(newfileName.ToString());
}
StreamWriter sw = new StreamWriter(newfileName.ToString(), false, Encoding.GetEncoding("gb2312"));
return sw;
}
public static int SaveCsv(IDataReader reader, string filename, int pagesize)
{
int innerCount = 0, outCount = 0;
Stopwatch watch = Stopwatch.StartNew();
watch.Start();
StreamWriter sw = GetStreamWriter(filename, outCount);
WriteHeader(reader, sw);
while (reader.Read())
{
if (innerCount < pagesize)
{
WriteContent(reader, sw);
innerCount++;
}
else
{
innerCount = 0;
outCount++;
sw.Flush();
sw.Close();
sw = GetStreamWriter(filename, outCount);
WriteHeader(reader, sw);
WriteContent(reader, sw);
innerCount++;
}
}
sw.Flush();
sw.Close();
watch.Stop();
return Convert.ToInt32(watch.ElapsedMilliseconds / 1000);
}
public static async Task ExportCsvAsync(IDataReader reader, string filename, int pagesize)
{
return await Task.Run(() => { return SaveCsv(reader, filename,pagesize); });
}
  
  3.设置拆分导出条件。财务工作中,涉及向业务单位分发各自的财务数据,如果采用手工筛选,然后分发效率较低,所以开发此功能,快速实现数据的拆分发送。
DSC0002.jpg
  
  4.自定义SQL代码导出。通过双击左边的表名即可自动生成导出SQL脚本,点击添加条件,还可以增加导出的条件。该工具在数据核查时,使用比较方便,虽然SQL server数据库也自带相应的功能,但是导出功能缺无法满足我的需求,所以开发一个方便自己使用的界面还是很有必要的。
DSC0003.jpg
  
  
  其他各项功能,及代码请参考github上的源码。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-80863-1-1.html 上篇帖子: 关于PDF.NET开发框架对Mysql Sqlite PostgreSQL数据库分页支持的个人看法 下篇帖子: sqlite和sql server语法上的一些区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表