52 个解决方案
#1
没遇到过,能否贴部分主要代码上来?
我先写一个测试一下,待会儿贴源码
我先写一个测试一下,待会儿贴源码
#2
测试导出速度超快滴:
源码:
源码:
private void toolStripLabel4_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl文件(*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "数据视图导出EXCEL文件";
saveFileDialog.ShowDialog();
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("utf-8"));
string str = "";
DateTime start = DateTime.Now;
try
{
//写标题
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
if (i > 0)
{
str += "\t";
}
str += dataGridView1.Columns[i].HeaderText;
}
sw.WriteLine(str);
//写内容
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
if (dataGridView1.Rows[j].Cells[k].Value == null)
{
tempStr += string.Empty;
}
else
{
tempStr += dataGridView1.Rows[j].Cells[k].Value.ToString();
}
}
sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sw.Close();
myStream.Close();
}
MessageBox.Show("将此工作表导出为excel共耗时:" + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "毫秒");
}
#3
楼上真不错。
#4
string yufuk = "";
SaveFileDialog dg = new SaveFileDialog();//保存文件对话框,选择导出文件的存放位置
dg.Filter = "xls files(*.xls)|*.xls";//保存为xls格式
if (dg.ShowDialog() == DialogResult.OK)
{
string filepath = dg.FileName.ToString();//保存文件的路径
Microsoft.Office.Interop.Excel.Workbooks objBooks;//接口 workbooks
Microsoft.Office.Interop.Excel.Sheets objSheets;// 接口 sheets
Microsoft.Office.Interop.Excel._Worksheet objSheet;//接口 worksheet
//Microsoft.Office.Interop.Excel.Range range = null;
excel = new Microsoft.Office.Interop.Excel.Application();
objBooks = excel.Workbooks;
Object miss = System.Reflection.Missing.Value;
objBook = objBooks.Add(miss);
objSheets = objBook.Sheets;
objSheet = (Microsoft.Office.Interop.Excel._Worksheet)objSheets[1];
//页边距
objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.LeftMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.RightMargin = excel.InchesToPoints(0.293700787401575);
try
{
switch (this.txtPayment.Text)
{
case "预付30%定金出货前付清全款":
yufuk = "预付款(30%)";
break;
case "预付20%定金出货前付清全款":
yufuk = "预付款(20%)";
break;
case "预付15%定金出货前付清全款":
yufuk = "预付款(15%)";
break;
case "预付10%定金出货前付清全款":
yufuk = "预付款(10%)";
break;
case "出货前验货付清全款":
yufuk = "预付款";
break;
case "月结":
yufuk = "预付款";
break;
}
excel.Visible = false; //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
objSheet.Activate();
#5
代码不完整,太长了,只是前半部分
#6
这个导出来以后都在第一个单元格里了` 比如我有10列`那么所有的这10列都会占到了同一个单元格里面了
改进一下就好了
#7
这是完整的导出代码
#8
楼上的把导出后在一个单元格的问题解决一下然后发上来
#9
saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
saveexcel . FilterIndex = 0;
saveexcel.RestoreDirectory = true;
saveexcel.Title = "導出檔保存路徑";
saveexcel.FileName = null;
saveexcel.ShowDialog();
string FileName = saveexcel.FileName;
if (FileName.Length != 0)
{
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine = "";
objFileStream = new FileStream(FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
for (int i = 0; i < dt.Columns.Count; i++)
{
strLine = strLine + dt.Columns[i].ColumnName.ToString() + Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine = "";
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
strLine = strLine + dt.Rows[i][j].ToString() + Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine = "";
}
objStreamWriter.Close();
objFileStream.Close();
MessageBox.Show("資料已經成功導出到:" + saveexcel.FileName.ToString(), "導出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
#10
用读取数据库的方式应该快点
#11
建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。
#12
跟上上面的一样` 用流往外导出确实要比一个一个往Excel的cell里面导值快`
但是这样格式就乱了` 都在一个单元格里面呢 要是能结合一下就好了
#13
1W行应该没事`采用循环导出效率那个低啊 好像不是电脑在干活
http://topic.csdn.net/u/20110221/15/7c23c4ea-5ed7-49d6-b167-1e202bdbd449.html
大家可以去这个上面看看
就是用的循环导出
#14
数据太多设置进度条
二维数组赋值到单元格
二维数组赋值到单元格
#15
开僻一个新进程来处理`刚才试了一下`也不怎么滴``设进度条也就是提示一下用户而
效率慢还是慢`妈的`就是找不到好办法
效率慢还是慢`妈的`就是找不到好办法
#16
数据不是太多,但必须不能用循环,因为每一行都不一样
#17
用流导出到文本 就10毫秒左右`导出到excel 800左右,
差太远了
#18
用流导出,格式没法控制
#19
我想知道时间流费在哪里了,我的机器10秒左右,有的机器5分钟,差的太多了
#20
机子配置不一样` 运行的东西不一样`进程优先级不一样
#21
没有解决办法了
#22
格式比较复杂,不用流输出
#23
导出数据太多就慢
#24
你导出的数据多大呀?我这里有个例子。可以联系我。
#25
一样可以控制
#26
我之前试过用流是最快的,我在CSDN下载区有一个实例,你可参考下:
C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,
http://download.csdn.net/source/1541900
C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,
http://download.csdn.net/source/1541900
#27
#28
网上好像有实例,找找看。
#29
#30
有很多导出方式,有一种先粘贴到系统内存,再从系统内存粘贴到excel很快的
#31
不见意使用流的方法, 格式没法控,需另存文件才能编辑。
#32
nkhuangyanping,没多大,50条记录,
#33
如果对于Excel的内部数据格式比较清楚的话,使用流输出也是可以控制格式的。最大的好处是,不需要安装office套件。
不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。
不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。
#34
#35
我用流导出的,你要什么输出什么格式?
#36
把一个二维object数组复制给一个扩大后的Range应该是最好的解决方案
导出到CSV速度是比较快,不过,CSV毕竟不是Excel
导出到CSV速度是比较快,不过,CSV毕竟不是Excel
#38
3楼的方法貌似不好 建议用OFFICE组件
#39
有没有什么优化方案,改进速度,这么慢怎么用啊,其他的软件导出Excel用的什么方法
#40
猩猩哥哥 为什么 Microsoft.Office. Interop.Excel点不出来? 是不是 Microsoft Office 2003的问题?
#41
这样的格式用什么方式导出更适合
#42
这样的格式用什么方式导出更合适
#43
追求速度,只能用 流文件的方式 导出EXCEL!
#44
webform还是WINFORM?
不行了数据量小点,用CSV
#45
数量量非常小,用CSV,格式怎样控件,要求有合并单元格,控制页边距等
#46
用ado 导入导出
#47
求winform程序好用进度条
#48
c#调用COM组件导出excel客户端不装office可以吗
#49
呵呵!~~
#50
对Excel的com缺少研究,之前下载过一个mvp的代码,速度也很慢。在没有比较好的方案之前,建议楼主使用异步结合进度条来创建Excel文档,首先解决掉窗体假死。
#1
没遇到过,能否贴部分主要代码上来?
我先写一个测试一下,待会儿贴源码
我先写一个测试一下,待会儿贴源码
#2
测试导出速度超快滴:
源码:
源码:
private void toolStripLabel4_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl文件(*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "数据视图导出EXCEL文件";
saveFileDialog.ShowDialog();
Stream myStream;
myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("utf-8"));
string str = "";
DateTime start = DateTime.Now;
try
{
//写标题
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
if (i > 0)
{
str += "\t";
}
str += dataGridView1.Columns[i].HeaderText;
}
sw.WriteLine(str);
//写内容
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
if (dataGridView1.Rows[j].Cells[k].Value == null)
{
tempStr += string.Empty;
}
else
{
tempStr += dataGridView1.Rows[j].Cells[k].Value.ToString();
}
}
sw.WriteLine(tempStr);
}
sw.Close();
myStream.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
sw.Close();
myStream.Close();
}
MessageBox.Show("将此工作表导出为excel共耗时:" + DateTime.Now.Subtract(start).TotalMilliseconds.ToString() + "毫秒");
}
#3
楼上真不错。
#4
string yufuk = "";
SaveFileDialog dg = new SaveFileDialog();//保存文件对话框,选择导出文件的存放位置
dg.Filter = "xls files(*.xls)|*.xls";//保存为xls格式
if (dg.ShowDialog() == DialogResult.OK)
{
string filepath = dg.FileName.ToString();//保存文件的路径
Microsoft.Office.Interop.Excel.Workbooks objBooks;//接口 workbooks
Microsoft.Office.Interop.Excel.Sheets objSheets;// 接口 sheets
Microsoft.Office.Interop.Excel._Worksheet objSheet;//接口 worksheet
//Microsoft.Office.Interop.Excel.Range range = null;
excel = new Microsoft.Office.Interop.Excel.Application();
objBooks = excel.Workbooks;
Object miss = System.Reflection.Missing.Value;
objBook = objBooks.Add(miss);
objSheets = objBook.Sheets;
objSheet = (Microsoft.Office.Interop.Excel._Worksheet)objSheets[1];
//页边距
objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.LeftMargin = excel.InchesToPoints(0.393700787401575);
objSheet.PageSetup.RightMargin = excel.InchesToPoints(0.293700787401575);
try
{
switch (this.txtPayment.Text)
{
case "预付30%定金出货前付清全款":
yufuk = "预付款(30%)";
break;
case "预付20%定金出货前付清全款":
yufuk = "预付款(20%)";
break;
case "预付15%定金出货前付清全款":
yufuk = "预付款(15%)";
break;
case "预付10%定金出货前付清全款":
yufuk = "预付款(10%)";
break;
case "出货前验货付清全款":
yufuk = "预付款";
break;
case "月结":
yufuk = "预付款";
break;
}
excel.Visible = false; //让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
objSheet.Activate();
#5
代码不完整,太长了,只是前半部分
#6
这个导出来以后都在第一个单元格里了` 比如我有10列`那么所有的这10列都会占到了同一个单元格里面了
改进一下就好了
#7
这是完整的导出代码
#8
楼上的把导出后在一个单元格的问题解决一下然后发上来
#9
saveexcel . Filter = "Execl files (*.xls)|*.xls|文本文件|*.txt";
saveexcel . FilterIndex = 0;
saveexcel.RestoreDirectory = true;
saveexcel.Title = "導出檔保存路徑";
saveexcel.FileName = null;
saveexcel.ShowDialog();
string FileName = saveexcel.FileName;
if (FileName.Length != 0)
{
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine = "";
objFileStream = new FileStream(FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
for (int i = 0; i < dt.Columns.Count; i++)
{
strLine = strLine + dt.Columns[i].ColumnName.ToString() + Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine = "";
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
strLine = strLine + dt.Rows[i][j].ToString() + Convert.ToChar(9);
}
objStreamWriter.WriteLine(strLine);
strLine = "";
}
objStreamWriter.Close();
objFileStream.Close();
MessageBox.Show("資料已經成功導出到:" + saveexcel.FileName.ToString(), "導出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
#10
用读取数据库的方式应该快点
#11
建议,采用循环导出,不要1次性导出,因为如果数据量大的话,可能很慢。
#12
跟上上面的一样` 用流往外导出确实要比一个一个往Excel的cell里面导值快`
但是这样格式就乱了` 都在一个单元格里面呢 要是能结合一下就好了
#13
1W行应该没事`采用循环导出效率那个低啊 好像不是电脑在干活
http://topic.csdn.net/u/20110221/15/7c23c4ea-5ed7-49d6-b167-1e202bdbd449.html
大家可以去这个上面看看
就是用的循环导出
#14
数据太多设置进度条
二维数组赋值到单元格
二维数组赋值到单元格
#15
开僻一个新进程来处理`刚才试了一下`也不怎么滴``设进度条也就是提示一下用户而
效率慢还是慢`妈的`就是找不到好办法
效率慢还是慢`妈的`就是找不到好办法
#16
数据不是太多,但必须不能用循环,因为每一行都不一样
#17
用流导出到文本 就10毫秒左右`导出到excel 800左右,
差太远了
#18
用流导出,格式没法控制
#19
我想知道时间流费在哪里了,我的机器10秒左右,有的机器5分钟,差的太多了
#20
机子配置不一样` 运行的东西不一样`进程优先级不一样
#21
没有解决办法了
#22
格式比较复杂,不用流输出
#23
导出数据太多就慢
#24
你导出的数据多大呀?我这里有个例子。可以联系我。
#25
一样可以控制
#26
我之前试过用流是最快的,我在CSDN下载区有一个实例,你可参考下:
C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,
http://download.csdn.net/source/1541900
C# DataGridView 导出 Excel,只用System.IO文件流快速导出可用窗口代码实例,不受EXCEL版本是否安装Excel的限制, 对20000条记录x 130列数据只需1-2分钟,
http://download.csdn.net/source/1541900
#27
#28
网上好像有实例,找找看。
#29
#30
有很多导出方式,有一种先粘贴到系统内存,再从系统内存粘贴到excel很快的
#31
不见意使用流的方法, 格式没法控,需另存文件才能编辑。
#32
nkhuangyanping,没多大,50条记录,
#33
如果对于Excel的内部数据格式比较清楚的话,使用流输出也是可以控制格式的。最大的好处是,不需要安装office套件。
不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。
不过大部分人不愿意花这个时间来研究格式,就乖乖使用微软提供的库操作吧,速度没流输出快是必然的,使用进度条之类的让它好看一点吧。
#34
#35
我用流导出的,你要什么输出什么格式?
#36
把一个二维object数组复制给一个扩大后的Range应该是最好的解决方案
导出到CSV速度是比较快,不过,CSV毕竟不是Excel
导出到CSV速度是比较快,不过,CSV毕竟不是Excel
#37
#38
3楼的方法貌似不好 建议用OFFICE组件
#39
有没有什么优化方案,改进速度,这么慢怎么用啊,其他的软件导出Excel用的什么方法
#40
猩猩哥哥 为什么 Microsoft.Office. Interop.Excel点不出来? 是不是 Microsoft Office 2003的问题?
#41
这样的格式用什么方式导出更适合
#42
这样的格式用什么方式导出更合适
#43
追求速度,只能用 流文件的方式 导出EXCEL!
#44
webform还是WINFORM?
不行了数据量小点,用CSV
#45
数量量非常小,用CSV,格式怎样控件,要求有合并单元格,控制页边距等
#46
用ado 导入导出
#47
求winform程序好用进度条
#48
c#调用COM组件导出excel客户端不装office可以吗
#49
呵呵!~~
#50
对Excel的com缺少研究,之前下载过一个mvp的代码,速度也很慢。在没有比较好的方案之前,建议楼主使用异步结合进度条来创建Excel文档,首先解决掉窗体假死。