`
ouxitao
  • 浏览: 8643 次
文章分类
社区版块
存档分类
最新评论

Java使用jacob组件读取大量Excel数据,性能差的问题

阅读更多
使用Jacob读取数据的时候,数据也就8000左右,为什么会很慢呢?
  求大牛指点下,谢谢

public static void main(String[] args) throws FileNotFoundException, IOException {
String filename="C:/text/1234.xlsx";
ComThread.InitSTA();
/**
* 声明变量
* */
String xuhao = "";
String xuhao1 ="";
String number1 = "";
String number = "";
String name = "";
String mps = "";
String count = "";
// String unit="";
String cl = "";
String lbjzl = "";
String ps = "";
String bz = "";
String unit = "";
String isEndItem = "n";
String pn = "";
int flag = 0;
List list = new LinkedList();
ActiveXComponent xl=new ActiveXComponent("Excel.Application");

xl.setProperty("Visible", new Variant(false));//Excel显示或者隐藏
Dispatch workbooks=xl.getProperty("Workbooks").toDispatch();//获得workBooks

Variant workbookV=workbooks.invoke(workbooks, "Open", //打开Excel
Dispatch.Method,
new Object[] { filename, new Variant(false),//Excel的位置
                new Variant(false) },   
        new int[1]);

Dispatch workbook=workbookV.toDispatch();//获得workbook
Dispatch sheets= Dispatch.get(workbook,"Worksheets").toDispatch();//获得所有的Sheet
int SheetCount=Dispatch.get(sheets,"Count").getInt();//获得有多少个sheet
System.out.println("11111111111111111111111111111111111111111111");
for(int i=1;i<=SheetCount;i++){//遍历sheets
Dispatch sheet = Dispatch.invoke(sheets,
"Item",
Dispatch.Get,
new Object[] { new Integer(i) },
new int[1]).toDispatch();
String sheetName=Dispatch.get(sheet,"Name").toString();//获得sheet的名字

if(sheetName.indexOf("BOM")>=0){//判断sheet名字是否有包含BOM
//System.out.println(sheetName+"------------------------------------------");
Dispatch userRange=Dispatch.call(sheet, "UsedRange").toDispatch();//获取Excel使用的sheet
Dispatch row=Dispatch.call(userRange, "Rows").toDispatch();
int rowCount=Dispatch.get(row,"Count").getInt();//excel的使用的行数
//Dispatch cell=Dispatch.call(userRange, "Columns").toDispatch();
//int cellCount=Dispatch.get(cell,"Count").getInt();//Excel使用列数
int beginPosition = getRecordRow(userRange,1,rowCount);
System.out.println(sheetName+"------------------------------------------"+rowCount);
for(int j=beginPosition;j<=rowCount;j++){//循环Excel中sheet的行数
HashMap<String, String> partInfo = new HashMap<String, String>();

number=GetValue(row,"B"+(j-1));
xuhao=GetValue(row,"A"+(j-1));
if (number.equals("物料编号")) {

}else{
//if (xuhao.equals("编制:") && j==){
// break;
//}
if ((!number.equals(""))) {
flag = 0;
partInfo = getPartInfo(xuhao1, number1,
name, mps, count, unit, cl, lbjzl,
ps, pn, bz, isEndItem);
list.add(partInfo);
number1 = number;
xuhao1 =xuhao;
name=GetValue(row, "C"+j);
mps=GetValue(row, "D"+j);
count=GetValue(row, "L"+j);
unit=GetValue(row, "M"+j);
cl=GetValue(row, "N"+j);
lbjzl=GetValue(row, "O"+j);
ps=GetValue(row, "Q"+j);
pn=GetValue(row, "R"+j);
bz=GetValue(row, "T"+j);
if (xuhao.equals("0.1")) {
isEndItem = "y";
} else {
isEndItem = "n";
}
}else{
flag++;
if (flag > 4)
continue;
if (flag == 4) {
// System.out.println("编号:"+number1+"  "+"名称:"+name+"  "+"主要参数:"+mps+"  "+"材料:"+cl+"  "+"零部件重量:"+lbjzl+"  "+"生产状态:"+ps+"  "+"备注:"+bz+"  ");
mps=mps+GetValue(row, "D"+j);
partInfo = getPartInfo(xuhao1, number1,
name, mps, count, unit, cl,
lbjzl, ps, pn, bz, isEndItem);
list.add(partInfo);
number = number1 = "";
xuhao =xuhao1= "";
name = "";
mps = "";
count = "";
cl = "";
unit = "";
// unitKey="";
lbjzl = "";
ps = "";
pn = "";
bz = "";
isEndItem = "n";
xuhao = "";
// flag=0;
// i=getRecordRow(sheet,
// currentRow-1)-1;
}
}
}

}
}else{
continue;
}

}
System.out.println(list.size()+"---------List.Size()");
Variant f = new Variant(false);  
Dispatch.call(workbook, "Close",f);
ComThread.Release();
}


//读取Excel的值
public static String GetValue(Dispatch sheet, String position) { 
        Dispatch cell = Dispatch.invoke(sheet, "Range", Dispatch.Get, 
                new Object[] { position }, new int[1]).toDispatch(); 
        String value = Dispatch.get(cell, "Value").toString();
        return value; 
    } 

//把数字转换成Excel中的列数
public  static String ConvertToColName(int colIndex) {

String strRtn = "";
if (colIndex <= 0){
return "";
}

int numMod = 0;
int numTemp = colIndex;
char ch = 'A';

do{
numMod = numTemp % 26;
numTemp = numTemp / 26;
if (numMod == 0) {
ch = 'Z';
numTemp--;
}
else{
ch = (char)('A' + numMod - 1);
}

strRtn = ch + strRtn;
}

while (numTemp > 0);
return strRtn;
}

public static int getRecordRow(Dispatch sheet, int rowNumber,int rowCount) {
int ReturnrowCount = 0;
for (int i = rowNumber; i < rowCount; i++) {
String addres="B"+i;
String temp = GetValue(sheet,addres);
if (temp.equals("物料编号")) {
// System.out.println("物料编号所在行数:"+(i+1));
ReturnrowCount = i;
break;
}
}
return ReturnrowCount + 1;
}

/**
* 把读取到的值封装成HashMap
*
* **/
public static HashMap<String, String> getPartInfo(String xuhao,
String number, String name, String mps, String count, String unit,
String cl, String lbjzl, String ps, String pn, String bz,
String isEndItem) {
HashMap<String, String> part = new HashMap<String, String>();
part.put("xuhao", xuhao);
part.put("number", number);
part.put("name", name);
part.put("mps", mps);
part.put("count", count);
part.put("unit", unit);
part.put("cl", cl);
part.put("lbjzl", lbjzl);
part.put("ps", ps);
part.put("pn", pn);
part.put("bz", bz);
part.put("isEndItem", isEndItem);
return part;
}

使用Jacob读取数据的时候,数据也就8000左右,为什么会很慢呢?
  求大牛指点下,谢谢


怎么就没人说说是怎么回事呢?
我知道是和COM接口使用过多造成的,但是又不知道怎么改
name=GetValue(row, "C"+j);
mps=GetValue(row, "D"+j);
count=GetValue(row, "L"+j);
unit=GetValue(row, "M"+j);
cl=GetValue(row, "N"+j);
lbjzl=GetValue(row, "O"+j);
ps=GetValue(row, "Q"+j);
pn=GetValue(row, "R"+j);
bz=GetValue(row, "T"+j);

就是这段太慢了,去掉这段只要30秒,加上就要4分钟左右,大家说说有什么好的方式读呢?
分享到:
评论

相关推荐

    java jacob调用autocad读取文件

    总的来说,Java Jacob调用AutoCAD读取文件是一项强大的技术,它能够帮助开发者在Java环境中实现与AutoCAD的深度集成,从而提升工作效率,实现复杂的数据交换和自动化任务。但同时也需要注意,这种技术要求开发者对...

    运用jacob方式,java操作 excel文件读写(含配置文件和实例)

    在Java编程环境中,有时我们需要对Excel文件进行读取和写入操作,这通常是数据分析、报表生成或数据导入导出等任务的一部分。Jacob库提供了一种有效的方法来实现这个目标,尤其是在处理老版本的Microsoft Excel(如...

    Jacob Word excel 转PDF 合并PDF文件

    标题提到的"Jacob Word excel 转PDF 合并PDF文件"是指使用Jacob库来将Microsoft Word和Excel文档转换为PDF格式,并进一步合并多个PDF文件。Jacob(Java Advanced COM Bridge)是一个Java库,它允许Java应用程序与...

    java+jacob解析Excel文档并插入到mysql

    2. **读取Excel文件**:使用Jacob的`ActiveXComponent`和`Dispatch`类打开并读取Excel文件。通过`Dispatch.get()`和`Dispatch.call()`方法来访问和操作Excel对象,例如获取工作簿、工作表和单元格的数据。 3. **...

    JAVA 读取visio word excel 数据及详细jar使用说明

    在Java开发中,有时我们需要与Microsoft Office应用程序如Visio、Word和Excel进行数据交互,以实现自动化处理或数据导入导出。本主题将详细介绍如何利用Java中的特定库来完成这一任务,特别是通过args4j-2.0.1.jar、...

    jacob读取word表格

    标题“jacob读取word表格”涉及到的是使用Jacob库来操作Microsoft Word文档,特别是从中读取表格数据。Jacob是一个Java到COM桥接库,允许Java应用程序调用COM组件,如Microsoft Office的应用程序。 在Java中,直接...

    Java打印Excel文件所用的组件 jacob-1.14.3-x64

    `jacob`是Java和COM(Component Object Model)之间的桥梁,它允许Java程序与COM组件交互,比如读取、修改或打印Excel文件。 `jacob-1.14.3-x64`是`jacob`库的一个特定版本,针对64位操作系统。这个版本兼容JDK ...

    JACOB操作word和excel示例

    在IT行业中, Jacob库是一个非常实用的工具,它允许Java应用程序与Microsoft Office进行交互,包括Word和Excel。本文将深入探讨如何使用Jacob库来操作Word和Excel,通过提供的示例文档,我们将理解如何进行文件转换...

    用Jacob自动化操作Excel

    Jacob基于单线程模型,所以在多线程环境下操作Excel时需要注意同步问题,以避免数据冲突。另外,频繁的COM调用可能影响性能,因此尽量批量处理操作。 10. **其他高级功能** Jacob还支持更复杂的Excel操作,如公式...

    jacob操作word,excel(图表,表格等)代码

    - 性能问题:由于涉及跨语言通信,操作大量数据时可能会有性能瓶颈。 总结,Jacob为Java开发者提供了一种实用的途径,能够利用Office的强大功能,尤其是处理复杂报告和数据分析时。尽管有一些限制和挑战,但在合适...

    Java打印Excel文件所有的组件 jacob-1.14.3-x64

    2. **读取数据**:使用`Range`对象,你可以访问并读取Excel工作表中的单元格数据。 3. **写入数据**:同样通过`Range`,可以设置单元格的值,更新或添加新的数据到工作表中。 4. **格式化**:可以改变单元格的样式,...

    jacob_excel_reader-master

    总结来说,"jacob_excel_reader-master"项目提供了一种利用Jacob库在Java中高效读取Excel文件的方案。通过深入理解Jacob的工作原理和项目中的API设计,开发者可以更好地应对大量Excel数据处理的需求,提升工作效率。...

    Java-COM中间件 JACOB

    5. **线程安全**:考虑到Java和COM的多线程模型可能存在的差异,JACOB提供了一套机制来处理线程同步问题,确保在并发环境下安全地使用COM组件。 6. **错误处理**:JACOB会将COM的错误代码映射为Java的异常,使得...

    jacob是java平台下对excel,word进行打印等操作工具

    Jacob是Java平台上一个重要的库,专门用于与Microsoft Office应用程序(如Excel和Word)进行交互,实现数据的读取、写入、打印等操作。它的全名JAVA-COM Bridge,正如其名,它充当了Java与COM(Component Object ...

    java操作office poi jacob

    POI提供了API,使得开发者可以方便地创建、修改和读取Excel文件。例如,你可以使用POI创建一个新的工作簿,添加工作表,插入数据,设置单元格样式,甚至执行复杂的公式和图表操作。 - 创建工作簿:`XSSFWorkbook ...

    jacob打印机打印本地的excel和word

    在IT行业中, Jacob库是一个Java to COM Bridge,它允许Java应用程序使用COM(Component Object Model)组件,例如Microsoft Office的应用程序,如Excel和Word。本文将深入探讨如何利用Jacob库实现本地Excel和Word...

    jacob--Java 与 COM 组件的互操作

    Jacob使得Java开发者能够无缝地调用和控制使用COM技术构建的组件,极大地扩展了Java应用程序的功能。 Jacob的核心功能在于提供了一个Java到COM的桥接,允许Java代码创建、访问和操作COM对象。它通过JNI(Java ...

    jacob乱码原因解释

    总结,"jacob乱码原因解释"涉及到的关键知识点包括:文件编码理解,Java I/O操作,Jacob API的正确使用,Office文档元数据处理,字符集兼容性,以及潜在的兼容性问题。理解和解决这些问题对于顺利进行Office到HTML的...

Global site tag (gtag.js) - Google Analytics