zoukankan      html  css  js  c++  java
  • 021医疗项目-模块二:药品目录的导入导出-介绍poi类

    我们使用的是.10版本

    Apache POI - the Java API for Microsoft Documents,Apache POI 是用Java编写的免费开源的跨平台的 Java API,它可以创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。

    学习的目标:

    使用HSSF和XSSF来操作exce文档。这篇文章还不涉及到具体的药品表的导入导出,只是学习HSSF和XSSF的使用罢了。

    HSSF相对于XSSF是比较老的版本.他的特点是只能操作.xml文件,一个sheet(表格)行有限制,最大只能是65535行。

    HSSF的操作步骤:

    第一步:创建workbook工作簿(excel文档)

    Workbook wb = new HSSFWorkbook();
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();

    第二步:创建一个sheet工作表

    Sheet sheet3 = wb.createSheet(safeName);

    第三步:在sheet中创建row行

    Row row = sheet.createRow((short)0);

    第四步:在row行中创建cell单元格

    Cell cell = row.createCell(0);

    第五步:向cell中写数据

    cell.setCellValue(1);

    第六步:输出excel文件(写文件)

    wb.write(fileOut);
        fileOut.close();

    测试代码:

    // 创建文件输出流
            FileOutputStream out = new FileOutputStream("d:/workbook.xls");
            // 创建一个工作簿
            Workbook wb = new HSSFWorkbook();
                
            for (int j = 0; j < 1; j++) {
                Sheet s = wb.createSheet();//创建1个sheet
                wb.setSheetName(j, "sheet" + j);//指定sheet的名称
                //xls文件最大支持65536行
                for (int rownum = 0; rownum < 65535; rownum++) {//创建行,.xls一个sheet中的行数最大65535
                    // 创建一行
                    Row r = s.createRow(rownum);
    
                    for (int cellnum = 0; cellnum < 10; cellnum ++) {//一行创建10个单元格
                        // 在行里边创建单元格
                        Cell c = r.createCell(cellnum);
                        //向单元格写入数据
                        c.setCellValue(cellnum);
    
                    }
    
                }
    
            }
            System.out.println("int..............");
            wb.write(out);//输出文件内容
            
            
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            out.close();

    结果在d盘下找到了一个叫做workbook.xls的excel表格。

    测试成功。

    但是当我把65535改为65536时就会出现报错。

    报错的内容是内存溢出。

    所以HSSF的限制就是一个sheet中只能最大有65535行。

    出现内存溢出原因,HSSF工作原理,将excel中所有数据填充到java对象中,进行文件写操作。

     HSSF:

    缺点:

    如果数据大,引起内存溢问题。

     优点:

    编程方便,如果数据量小,速度很快的。

    为了解决上面的问题,我们引入了一个XSSF类。它对行数是没有限制的。

    SSF操作03以上版本(07版本)excel,扩展名.xlsx,工作表行数没有限制

    写excel文件步骤:

    第一步:创建一个工作簿

    SXSSFWorkbook wb = new SXSSFWorkbook(-1);

    -1:关闭自动刷新

    SXSSFWorkbook wb = new SXSSFWorkbook(XXXX);(自动刷新)

    XXXX:保持内存中有XXXX条记录,超过部分写入磁盘

    第二步:创建一个工作表

    //创建一个sheet

    Sheet sh = wb.createSheet();

    第三步:在sheet中创建行

    Row row = sh.createRow(rownum);

    第四步:创建单元格

    Cell cell = row.createCell(cellnum);

    第五步:向单元格中写数据

    cell.setCellValue(address);

    第六步:将内容写入磁盘

    由于-1设置关闭自动刷新

    需要人工主动刷新

    调用:

    ((SXSSFSheet)sh).flushRows(100);

    第七步:输出文件

    wb.write(out);//将临时写的文件合并,输出整个文件

     测试代码:

    package poi;
    
    import java.io.FileOutputStream;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellReference;
    import org.apache.poi.xssf.streaming.SXSSFSheet;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    
    /**
     * 采用SXSSF导出excel不出现内存溢出
     * @author mrt
     *
     */
    public class WriteExcelSXSSF1 {
    
        public static void main(String[] args) throws Throwable {
            
            //创建一个SXSSFWorkbook
            SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory
            //创建一个sheet
            Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 100000; rownum++){
            //创建一个行
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){//创建单元格
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();//单元格地址
                cell.setCellValue(address);
            }
    
           // manually control how rows are flushed to disk 
           if(rownum % 10000 == 0) {//一万行向磁盘写一次
              
                ((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others
                //Thread.sleep(1000);
                System.out.println("写入....");
                // ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0),
                // this method flushes all rows
           }
    
        }
        FileOutputStream out = new FileOutputStream("d:/test.xlsx");
        wb.write(out);//将临时文件合并,写入最终文件
        
        out.close();
    
        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    
        }
    
    }

    上面的数据是100000,但是没有出现异常,程序正常的运行了。

    临时文件内容就是向excel中写的内容,

    最后执行文件合并,将文件输出。

     XSSF:

    缺点:写数据时速度慢

    优点:写大数据量时不会发生内存溢出

    本系统采用XSSF导出药品目录 信息。

  • 相关阅读:
    第十六周个人作业
    排球比赛积分程序
    本周个人总结
    本周个人总结
    排球积分规则
    我与计算机
    排球计分(实践)
    观后感
    18周 个人作业
    总结
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/6089558.html
Copyright © 2011-2022 走看看