vba程序从excel表格读取数据(数据量=2000行),程序运行时特别慢,怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vba程序从excel表格读取数据(数据量=2000行),程序运行时特别慢,怎么解决?相关的知识,希望对你有一定的参考价值。

给原数据减肥,可能原数据有大量的公式,或者其他对象图形。追问

ReDim arrP(1 To I)
ReDim arrD(1 To I)
ReDim arrL(1 To I)

参考技术A 贴出代码?看看能否优化~追问

For i= 1 To I
arrP(i) = EXC_APP.Cells(iRow , 1)
arrD(i) = EXC_APP.Cells(iRow , 2)
arrL(i) = EXC_APP.Cells(iRow , 3)
Next

《程序实现》从xmltxt文件里读取数据写入excel表格

直接上码

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import java.util.regex.*;

import javax.swing.JFileChooser;


public class main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int a=0;
        int b=0;
        int countTemp=0;
        int row=1;
        String temp=null;
        try {
            WritableWorkbook wwb = null;    
                //首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象    
            wwb = Workbook.createWorkbook(new File("C:/Users/Administrator/Desktop/result.xls"));
            WritableSheet ws = wwb.createSheet("Sheet 1", 0);
            String th[] = { "弹幕ID", "用户ID", "弹幕发送时间", "字体颜色", "字号", "弹幕类型", "弹幕字数" };
            WritableFont contentFont = new WritableFont(WritableFont.createFont("楷体 _GB2312"), 12, WritableFont.NO_BOLD);
            WritableCellFormat contentFormat = new WritableCellFormat(contentFont);
            for (int i = 0; i < 7; i++) {
                ws.addCell(new Label(i, 0, th[i], contentFormat));
            }
            
            
            JFileChooser jfc1=new JFileChooser("d:/");
            jfc1.showOpenDialog(null);
            File sf1=jfc1.getSelectedFile();
            String readFile=sf1.getAbsolutePath();
            //String readFile="C:/Users/Administrator/Desktop/first.xml";
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(readFile)));
            while((temp=br.readLine())!=null){
                a=0;
                b=0;
                countTemp=0;
                String temp1=null;
                String[] th1=new String[6];
                //System.out.println(temp);
                String regEx = "\\<d.*\\<\\/d\\>";
                Pattern pat = Pattern.compile(regEx);
                Matcher mat = pat.matcher(temp);
                if(mat.find()){
                    temp1=mat.group();
                    //System.out.println(temp1);
                }else{
                    continue;
                }
                //计算用户ID
                for(int i=0;i<temp1.length();i++){
                    if(temp1.charAt(i)==,){
                        countTemp++;
                    }
                    if(countTemp==6 && a==0){
                        a=i;
                    }
                    if(countTemp==7){
                        b=i;
                        break;
                    }
                }
                //System.out.println(a);
                //System.out.println(b);
                th1[0]=temp1.substring(a+1, b);
                //计算弹幕发送时间
                for(int i=0;i<temp1.length();i++){
                    if(temp1.charAt(i)=="){
                        a=i;
                    }
                    if(temp1.charAt(i)==,){
                        b=i;
                        break;
                    }
                }
                th1[1]=temp1.substring(a+1, b);
                //计算字体颜色
                a=0;
                b=0;
                countTemp=0;
                for(int i=0;i<temp1.length();i++){
                    if(temp1.charAt(i)==,){
                        countTemp++;
                    }
                    if(countTemp==3 && a==0){
                        a=i;
                    }
                    if(countTemp==4){
                        b=i;
                        break;
                    }
                }
                th1[2]=temp1.substring(a+1, b);
                //计算字号
                a=0;
                b=0;
                countTemp=0;
                for(int i=0;i<temp1.length();i++){
                    if(temp1.charAt(i)==,){
                        countTemp++;
                    }
                    if(countTemp==2 && a==0){
                        a=i;
                    }
                    if(countTemp==3){
                        b=i;
                        break;
                    }
                }
                if(Integer.parseInt(temp1.substring(a+1, b))==12){
                    th1[3]="非常小";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==16){
                    th1[3]="特小";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==18){
                    th1[3]="";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==25){
                    th1[3]="";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==36){
                    th1[3]="";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==45){
                    th1[3]="很大";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==64){
                    th1[3]="特别大";
                }
                //计算弹幕类型
                a=0;
                b=0;
                countTemp=0;
                for(int i=0;i<temp1.length();i++){
                    if(temp1.charAt(i)==,){
                        countTemp++;
                    }
                    if(countTemp==1 && a==0){
                        a=i;
                    }
                    if(countTemp==2){
                        b=i;
                        break;
                    }
                }
                if(Integer.parseInt(temp1.substring(a+1, b))==1||Integer.parseInt(temp1.substring(a+1, b))==2||Integer.parseInt(temp1.substring(a+1, b))==3){
                    th1[4]="滚动弹幕";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==4){
                    th1[4]="底端弹幕";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==5){
                    th1[4]="顶端弹幕";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==6){
                    th1[4]="逆向弹幕";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==7){
                    th1[4]="精准定位";
                }else if(Integer.parseInt(temp1.substring(a+1, b))==8){
                    th1[4]="高级弹幕";
                }
                //计算弹幕字数
                for(int i=1;i<temp1.length();i++){
                    if(temp1.charAt(i)==>){
                        a=i;
                    }
                    if(temp1.charAt(i)==<){
                        b=i;
                        break;
                    }
                }
                //System.out.println(a);
                //System.out.println(b);
                th1[5]=String.valueOf((b-a)/2+1);//字数存在问题
                
                
                
                ws.addCell(new Label(0, row, new Integer(row).toString(), contentFormat));
                 for (int i = 0; i < 6; i++) {
                     ws.addCell(new Label(i+1, row, th1[i], contentFormat));
                 }
                row++;
            }
            wwb.write();
            wwb.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

使用javax.swing.JFileChooser出现访问限制错误,

Access restriction: The type JFileChooser is not accessible due to restriction on required library

解决办法:Project->Properties->Java Compiler->Errors/Warnings->Deprecated and restricted API->Forbidden reference改为warning,这样便可以用了。

程序的功能就是选择文件进行读取数据,将有效数据写入excel里,省去了要花费大量时间的人工输入。

以上是关于vba程序从excel表格读取数据(数据量=2000行),程序运行时特别慢,怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

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

excel表格数据量很大时如何提高vba的效率

Word VBA 读取 任意表格的高度和宽度

Excel数据量太大,用VBA运算依然会耗时太久,运行很慢,该怎么办?

MATLAB中读取excel数据

VBA SQL写入语句,从一个表格写入令一个表格?