解决方案 »
- C#如何利用timer做成倒计时,显示分钟和秒
- 在从服务器接收结果时发生传输级错误。 (provider: Shared Memory Provider, error: 0 - 句柄无效。)
- 一个SQL server统计问题
- 关于弹出窗口执行完打印命令后,自动关闭代码?
- DataGrid的排序问题,求高手解答!!!!!!
- 请问一下C#里面 const 和readonly 有什么区别
- C#使用TCP协议传输C++产生的一系列数据
- 动软生成的 AccountsPrincipal.ValidateLogin(userName, Password)这个是怎么使用的
- 请问什么地方有C#调用腾讯云通信的DEMO啊。
- datagriview用txt导出
- 为什么会弹出这么个东西,求指教
- WPF 下拉菜单样式
通过nopi直接将DT直接转换为EXCEL文件,速度比较快,因为DT就是在内存里面的临时表
NOPI要用2.4以上版本的,有这个功能
其实,EXCEL文件有缺陷,记录行超过5W多,老版本就不支持了。
另一种思路,用文件流方式,将DT直接写成CVS文件进行保存,EXCEL也可以直接打开,我试过每秒写个几万条记录不成问题的
只有3列,为什么循环4次,后面加个空单元格?
还有,处理数据和导出的过程最好分开,尽量不要一次执行太复杂的逻辑
导出前在别的地方把数据处理好,直接导出
发个链接,
http://blog.csdn.net/duanzi_peng/article/details/17414629
//导出按钮事件
private void btn_Export_Click(object sender, EventArgs e)
{
string[] P_str_Names = txt_Path.Text.Split(',');//存储所有选择的Excel文件名
string P_str_Name = "";//存储遍历到的Excel文件名
List<string> P_list_SheetNames = new List<string>();//实例化泛型集合对象,用来存储工作表名称
for (int i = 0; i < P_str_Names.Length - 1; i++)//遍历所有选择的Excel文件名
{
P_str_Name = P_str_Names[i];//记录遍历到的Excel文件名
P_list_SheetNames = GetSheetName(P_str_Name);//获取Excel文件中的所有工作表名
for (int j = 0; j < P_list_SheetNames.Count; j++)//遍历所有工作表
{
if (rbtn_Access.Checked)//判断Access数据库连接设置单选按钮选中
{//CodeGo.net/
ImportDataToAccess(P_str_Name, P_list_SheetNames[j]);//将将工作表内容导出到Access
}
else if (rbtn_Sql.Checked)//判断Sql Server数据库连接设置单选按钮选中
{
if (ckbox_Windows.Checked)//如果用Windows身份验证登录Sql Server
ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Initial Catalog =" + cbox_Server.Text + ";Integrated Security=SSPI;");//将工作表内容导出到Sql Server
else if (ckbox_SQL.Checked)//如果用Sql Server身份验证登录Sql Server
ImportDataToSql(P_str_Name, P_list_SheetNames[j], "Data Source=" + txt_Server.Text + ";Database=" + cbox_Server.Text + ";Uid=" + txt_Name.Text + ";Pwd=" + txt_Pwd.Text + ";");//将工作表内容导出到Sql Server
}
}
}
MessageBox.Show("已经将所有选择的Excel工作表导入到了指定的数据库中!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//存储泛型集合
private List<string> GetSheetName(string P_str_Excel)//获取所有工作表名称
{
List<string> P_list_SheetName = new List<string>();//实例化泛型集合对象
//连接Excel数据库
OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=Excel 8.0");
olecon.Open();//打开数据库连接
System.Data.DataTable DTable = olecon.GetSchema("Tables");//实例化表对象
DataTableReader DTReader = new DataTableReader(DTable);//实例化表读取对象
while (DTReader.Read())//循环读取
{
string P_str_Name = DTReader["Table_Name"].ToString().Replace('$', ' ').Trim();//记录工作表名称
if (!P_list_SheetName.Contains(P_str_Name))//判断泛型集合中是否已经存在该工作表名称
P_list_SheetName.Add(P_str_Name);//将工作表名添加到泛型集合中
}
DTable = null;//清空表对象
DTReader = null;//清空表读取对象
olecon.Close();//关闭数据库连接
return P_list_SheetName;//返回得到的泛型集合
}
//导入指定数据库
private void ImportDataToAccess(string P_str_Excel, string P_str_SheetName)
{
object missing = System.Reflection.Missing.Value;//声明object缺省值
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//实例化Excel对象
//打开Excel文件
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(P_str_Excel, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
Microsoft.Office.Interop.Excel.Worksheet worksheet;//声明工作表
Microsoft.Office.Interop.Access.Application access = new Microsoft.Office.Interop.Access.Application();//实例化Access对象
worksheet = ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[P_str_SheetName]);//获取选择的工作表
worksheet.Move(workbook.Sheets[1], missing);//将选择的工作表作为第一个工作表
object P_obj_Name = (object)worksheet.Name;//获取工作表名称
excel.DisplayAlerts = false;//设置Excel保存时不显示对话框
workbook.Save();//保存工作簿
CloseProcess("EXCEL");//关闭所有Excel进程
try
{
access.OpenCurrentDatabase(txt_Access.Text, true, "");//打开Access数据库
//将Excel指定工作表中的数据导入到Access中
access.DoCmd.TransferSpreadsheet(Microsoft.Office.Interop.Access.AcDataTransferType.acImport, Microsoft.Office.Interop.Access.AcSpreadSheetType.acSpreadsheetTypeExcel97, P_obj_Name, P_str_Excel, true, missing, missing);
access.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);//关闭并保存Access数据库文件
CloseProcess("MSACCESS");//关闭所有Access数据库进程
}
catch
{
MessageBox.Show("Access数据库中已经存在" + P_str_SheetName + "表!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
CloseProcess("MSACCESS");//关闭所有Access数据库进程
}
}