利用VBA向excel表格中写入数据后,再次运行程序的话写入速度会非常慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用VBA向excel表格中写入数据后,再次运行程序的话写入速度会非常慢相关的知识,希望对你有一定的参考价值。

最近用VBA处理数据,发现一个非常怪异的问题。当我用VBA程序第一次向excel表格中写入数据时速度很快,但是当我保存文件之后,再次运行相同的VBA程序,这时写入的速度就会变得非常非常慢。在网上多方查找之后仍然没有答案,后来无意中发现如果我把那个表格全选,然后删除之后,再运行程序写入速度就恢复正常了。我的VBA程序是从其他excel文件里读取数据到数组里,然后再从数组写入到指定的excel文件里,并没有写入公式之类的东西,都是用的string型变量,直接写入的值。至于为什么会出现这种问题,到现在还是不明白,如果有excel高手明白是怎么回事,请不吝告知。

EXCEL在使用ADO对象的记录集时会发生内存泄漏,重复的查询可能会最终导致 Excel 用完了内存并引发错误,或导致 Excel 停止响应。
详见:https://support.microsoft.com/zh-cn/kb/319998
参考技术A 代码 可以有?追问

不好意思,不知道怎么回事总是提示字数超过限制,代码传不上来,只能用截屏的方式传上来了,您凑合着看看吧。

如何用java向指定的EXCEL单元格中写入数据?

我从外部上传了一个excel表,想直接改变某个单元格的内容,要怎么写代码?不需要重新创建excel表。希望大家帮帮忙,先谢谢了。

我们项目里用的 供你参考,没写全,你可以自己百度下

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

/**
* 导出excel
* @param reportParams 导出excel列名标示
* @param list导出excel值
* @param headersexcel头
* @param reportName·excel的sheet名
* @param response
* @param startRow从哪一行开始放list值
* @param startCol 从哪一列开始放list值
* @return
*/
public boolean report(ReportBean rb, List list, XlsHeaderBean[] headers, String reportName, HttpServletResponse response, int startRow, int startCol, HttpServletRequest request)
WritableWorkbook wwb = null;
OutputStream os;
boolean flag = true;
Date date = new Date();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String strDate = format.format(date);
try
// 用Workbook类的工厂方法创建工作薄(Workbook)对象
response.setContentType("application/x-msdownload");
String sheetName = "report";
sheetName = sheetName.replaceAll(":", "").replaceAll("[)]", "")
.replaceAll("[(]", "");
// 这里解释一下
// attachment; 这个代表要下载的,如果去掉就编程直接打开了
// filename是文件名,另存为或者下载时,为默认的文件名
response.addHeader("Content-Disposition", "attachment; filename="
+ new String(sheetName.getBytes("UTF-8"), "ISO-8859-1")+ strDate
+ ".xls");
os = response.getOutputStream();
wwb = Workbook.createWorkbook(os);
catch (IOException e)
e.printStackTrace();
return flag = false;

if (wwb != null)
// 创建一个可写入的工作表
// Workbook的createSheet方法两个参数,1名称,2位置
WritableSheet ws = wwb.createSheet(reportName, 0);
// 下面开始添加单元格
// 导出excel
try
Label labelC = null;
for(int j = 0; j < headers.length; j++)
if(headers[j].isUnion())
ws.mergeCells(headers[j].getCol(), headers[j].getRow(), headers[j].getCol()+headers[j].getColLength(), headers[j].getRow()+headers[j].getRowLength());

labelC = new Label(headers[j].getCol(), headers[j].getRow(), headers[j].getValue());
ws.addCell(labelC);

catch (RowsExceededException e)
e.printStackTrace();
catch (WriteException e)
e.printStackTrace();

String value = null;
for (int i = 0; i < list.size(); i++)
Map values = (Map)list.get(i);
for (int j = 0; j < rb.getReportParams().length; j++)
// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
Label labelC;
if(values.get(rb.getReportParams()[j]) == null)
value = "";
else
if(values.get(rb.getReportParams()[j]) instanceof java.util.Date)
value = format.format(values.get(rb.getReportParams()[j]));
else if(values.get(rb.getReportParams()[j]) instanceof java.math.BigDecimal)
value = values.get(rb.getReportParams()[j]).toString();
else
value = values.get(rb.getReportParams()[j]).toString();


labelC = new Label(j+startCol, i + startRow, value);
try
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
catch (RowsExceededException e)
e.printStackTrace();
return flag = false;
catch (WriteException e)
e.printStackTrace();
return flag = false;



if(rb.isHasImg())
String rootPath = this.getServletContext().getRealPath("savefiles");
String imgPath = rb.getImgPath();
if(rootPath != null && rootPath.compareTo("") != 0 && imgPath != null && imgPath.compareTo("") !=0)
String[] strs = imgPath.split("\\/");
String imgName = strs[strs.length-1];
File file = new File(rootPath + File.separator + imgName);
if(file.exists())
WritableImage wi = new WritableImage(0, startRow + list.size() + 2,12,20, file);
ws.addImage(wi);



try
// 从内存中写入文件中
wwb.write();
wwb.close();
return flag;
catch (IOException e)
e.printStackTrace();
return flag = false;
catch (WriteException e)
e.printStackTrace();
return flag = false;


return flag;
参考技术A 1.java操作excel的第三方开源包很多,比如poi,javaExcel,OpenXls等;
2.你可以下载上述的某个包,然后直接看它的API就ok了,直接改变单元格内容是最基础的方法,很容易的。

希望对你有所帮助~~追问

你能不能给我个具体的例子,谢谢了!

追答

你给我个邮箱,我给你发个例子过去~~

追问

发到我的qq邮箱吧,谢谢了。594788036@qq.com

追答

已发送,请查收!

本回答被提问者采纳

以上是关于利用VBA向excel表格中写入数据后,再次运行程序的话写入速度会非常慢的主要内容,如果未能解决你的问题,请参考以下文章

怎么用vba把txt文档中的数据导入到excel表格中?

如何在EXCEL中利用VBA拷贝表格时格式不变

如何在Excel表格中将系统导出的部门的代码,用公式或者vba转换成文字?

excel2007 VBA中如何引用指定的单元格地址?

EXCEL VBA 求助

从自定义 VBA 函数(非子函数)写入 Excel 工作表