c# Winform下向Excel导入数据的方法问题

xiaopei711 2009-08-14 03:55:59
做一个项目,需要将数据导入到指定Excel模板里面,我用的是调用com组件(Excel)方法,但是当数据比较多时,速度会很慢。各位有没有好一点的方法?让数据快速导入到Excel里面?
我的代码如下:
Excel.Application   app=   new   Excel.Application(); 
Excel.Workbook xbook=app.Workbooks._Open(@"D:\Sample.xlt",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
Excel.Worksheet xsheet=(Excel.Worksheet)xbook.Sheets[1];
xsheet = (Excel.Worksheet)app.ActiveSheet;
for(inti=0;i<datagridview1.RowCount;i++)
{//导入到Excel,从第五行开始写入数据。
app.cells[5+i,1] = datagridview1["Column1", i].Value.ToSteing();
app.cells[5+i,2] = datagridview1["Column2", i].Value.ToSteing();
app.cells[5+i,3] = datagridview1["Column3", i].Value.ToSteing();
app.cells[5+i,4] = datagridview1["Column4", i].Value.ToSteing();
app.cells[5+i,5] = datagridview1["Column5", i].Value.ToSteing();
app.cells[5+i,6] = datagridview1["Column6", i].Value.ToSteing();
app.cells[5+i,7] = datagridview1["Column7", i].Value.ToSteing();
app.cells[5+i,8] = datagridview1["Column8", i].Value.ToSteing();
}
message.box.Show("导入成功);
app.Visible=true;

当数据很多时,速度会很慢,望高人指点。给出一个好方法。最好有代码。谢谢!
...全文
382 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopei711 2009-11-08
  • 打赏
  • 举报
回复
再次感谢了!!!!
beifangqingyuan 2009-08-15
  • 打赏
  • 举报
回复


添加引用 using System.Data.OleDb;


if (dvData.Rows.Count >0 )
{
#region 向Excel写数据//===========================================
Excel.Application excel = new Excel.Application();
object oMissing = System.Reflection.Missing.Value;
Excel.Workbook xlsBook = excel.Workbooks.Open(filename + prdpz + ".xls", 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true);
if (xlsBook.Sheets.Count < cobMachID.SelectedIndex + 1)
{
xlsBook.Sheets.Add(oMissing, xlsBook.Sheets[xlsBook.Sheets.Count], oMissing, oMissing);
}
Excel._Worksheet xlsSheet = (Excel._Worksheet)xlsBook.Worksheets[cobMachID.SelectedIndex + 1];

xlsSheet.Name = cobMachID.SelectedItem.ToString();
xlsSheet.Activate();
excel.Visible = false;

int ExcelRC = xlsSheet.UsedRange.Cells.Rows.Count; //获取原有Excel中的行数

int totalnum = 0;

for (int ii = 0; ii < dvData.Rows.Count; ii++)// dvData 是指datagridview
{
for (int j = 0; j < dvData.ColumnCount; j++)
{
if (dvData[j, ii].ValueType == typeof(string))
{
excel.Cells[ExcelRC + ii + 1 + totalnum, j + 1] = "'" + dvData[j, ii].Value.ToString();
}
else
{
try
{
excel.Cells[ExcelRC + ii + 1 + totalnum, j + 1] = dvData[j, ii].Value.ToString();
}
catch(Exception ex)
{
// swlog(ex);
}
}

}
}
#endregion //============================================================
excel.Columns.EntireColumn.AutoFit(); //自动调整列宽
excel.Columns.EntireRow.AutoFit(); //自动调整行高
xlsBook.Save(); //保存
excel.Quit(); //退出
//KillProcess(); //
xlsBook = null;
xlsSheet = null;
excel = null;
}
else
{
mesgbox.show("没有数据可导出");
}
xiaopei711 2009-08-15
  • 打赏
  • 举报
回复
已解决,用个二维数组。速度快了很多,六百多行也就一下子就完成了!
感谢各位高人,重点感谢3L,11L和13L。谢谢!
xiaopei711 2009-08-15
  • 打赏
  • 举报
回复
大侠们不吝赐教啊!!!
xiaopei711 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tianrui456 的回复:]
哇 楼上大大们都提供了那么多的方法啊 哈哈 我也没仔细看~!~
  不过我来说明下我的发现(看别人+自己猜的)  excel导入数据慢的原因是由于 你在用cell[i,j]等寻找单元格的函数或属性时浪费的时间 你的数据量越大 使用的cell[i,j]越多 使用时间越长
  解决方法
 C# codeint[,] datas=newint[1,3];
datas[0,0]="";
datas[0,1]="0";
datas[0,2]="0";
xR= CurrWorkSheet.get_Range("A1","A2");//CurrWorkSheet是Microsoft.Office.Interop.Excel._Worksheet对象 xR= xR= xR.get_Resize(1,3);
xR.value2= datas;

  仅作产考(其中的列我没有设置格式 你可以找些资料自己设置列的格式)
[/Quote]

这位兄台可否再详细说下?
刚接触c#,不懂的地方太多。谢谢!
jo_say 2009-08-14
  • 打赏
  • 举报
回复
借鉴
liyoubaidu 2009-08-14
  • 打赏
  • 举报
回复
up
tianrui456 2009-08-14
  • 打赏
  • 举报
回复
上面打错了 ^_^ 应该是 string[,] datas = new string[1,3];
自己修正代码 +分给我啊
tianrui456 2009-08-14
  • 打赏
  • 举报
回复
哇 楼上大大们都提供了那么多的方法啊 哈哈 我也没仔细看~!~
不过我来说明下我的发现(看别人+自己猜的) excel导入数据慢的原因是由于 你在用cell[i,j]等寻找单元格的函数或属性时浪费的时间 你的数据量越大 使用的cell[i,j]越多 使用时间越长
解决方法

int[,] datas = new int[1,3];
datas[0, 0] = " ";
datas[0, 1] = "0";
datas[0, 2] = "0";
xR = CurrWorkSheet.get_Range("A1", "A2");//CurrWorkSheet是Microsoft.Office.Interop.Excel._Worksheet对象
xR = xR = xR.get_Resize(1, 3);
xR.value2 = datas;


仅作产考(其中的列我没有设置格式 你可以找些资料自己设置列的格式)
peterb 2009-08-14
  • 打赏
  • 举报
回复
xingjunli 2009-08-14
  • 打赏
  • 举报
回复
看看我的博文或许对你有帮助http://blog.csdn.net/xingjunli/archive/2009/07/13/4345069.aspx
大数据量明细数据填充如采用一个单元格单元格处理效率较低(将数据解析为二维数据进行自动填充Range.Value2将大大提高效率)

/// <summary>
/// 根据模版标签 整合要填充的数据集信息方法
/// </summary>
/// <param name="srcDataTable">源数据表</param>
/// <param name="detailsRange">标签区域</param>
/// <returns>填充的二维数组</returns>
public object[,] MergerExcelData(System.Data.DataTable srcDataTable, Range detailsRange)
{
object[,] dataArray = new object[srcDataTable.Rows.Count, detailsRange.Cells.Count];
string [] columnList = new string[detailsRange.Cells.Count];
Range range = null;
string parm = string.Empty;
for (int i = 0; i < detailsRange.Cells.Count; i++)
{
range = (Range)detailsRange.Cells[0, i];
if (range.Value2 != null)
{
parm = range.Value2.ToString();
}
parm = ReportUtils.FillterString(parm);
if (parm.IndexOf(">.") > 0)
{
parm = parm.Substring(1, parm.IndexOf(">") - 1);
}
else if (parm.IndexOf(">") >= 2)
{
parm = parm.Substring(1, parm.Length - 2);
}
else
{
parm = string.Empty;
}
columnList[i] = parm ;
}

for (int i = 0; i < srcDataTable.Rows.Count; i++)
{
for (int j = 0; j < columnList.Count; j++)
{
dataArray[i, j] = ReportUtils.GetDataTableData(srcDataTable, i, columnList[j]);
}
}
return dataArray;
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xingjunli/archive/2009/07/13/4345069.aspx
十八道胡同 2009-08-14
  • 打赏
  • 举报
回复
参考这个,用sql来做
#region Access 2007   
Console.WriteLine("Access 2007");
string strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;";
strConnection += @"Data Source=C:\Documents and Settings\v-changl\My Documents\Database1.accdb;";
strConnection += "Persist Security Info=False";
using (OleDbConnection objConnection = new OleDbConnection(strConnection))
{
objConnection.Open();
OleDbDataAdapter myCommandd = new OleDbDataAdapter("select * from Couse", objConnection);
DataSet ds = new DataSet();
myCommandd.Fill(ds, "couse");
DataTable dt = ds.Tables["couse"];
Console.WriteLine(dt.Columns[0].ToString());
Console.WriteLine(dt.Columns[1].ToString());
Console.WriteLine(dt.Columns[2].ToString());

objConnection.Close();

}
#endregion


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/LCL_data/archive/2009/05/06/4154255.aspx
xiaopei711 2009-08-14
  • 打赏
  • 举报
回复
楼上的能否说明白点?谢谢
adaiye 2009-08-14
  • 打赏
  • 举报
回复
其实就是利用缓存
不要像你原来那样每次循环都写到excel文件中,而是先将数据写到内存中,然后再一起写到Excel,并保存。
xxxxxchener 2009-08-14
  • 打赏
  • 举报
回复
= =用的VS2008,已经没有dataGrid,只有dataGridView
在工具箱里。右键。选择项。找到dataGrid控件。打勾。。OK。
Dao是什么东西?能发一份具体给我看看吗?感谢。
这是一个包。。其实也不是什么东西。就是你实现的基本类。
xiaopei711 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cpp2017 的回复:]
用oledb方式连接excel,用sql插入

[/Quote]
这也是个方法,可否给出关键代码?关键是用insert插入时,怎么让他从第五行开始插入数据?
望指点。
xiaopei711 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bigmingming 的回复:]
参考
http://www.cnblogs.com/hyqiang168/archive/2007/12/27/1017032.html
[/Quote]
不是很懂,能否详细点?
刚接触c#不久。
xmrforever 2009-08-14
  • 打赏
  • 举报
回复
帮你顶一下
bigmingming 2009-08-14
  • 打赏
  • 举报
回复
参考
http://www.cnblogs.com/hyqiang168/archive/2007/12/27/1017032.html
yuanleijiwei 2009-08-14
  • 打赏
  • 举报
回复
我也只会你这种的,关注!
加载更多回复(1)

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧