博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
021医疗项目-模块二:药品目录的导入导出-介绍poi类
阅读量:6154 次
发布时间:2019-06-21

本文共 4402 字,大约阅读时间需要 14 分钟。

我们使用的是.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导出药品目录 信息。

 

转载地址:http://tibfa.baihongyu.com/

你可能感兴趣的文章
docker的核心原理-cgroup
查看>>
浅析操作系统函数调用原理-附实例
查看>>
直线恒过定点问题
查看>>
Elasticsearch初级语句入门
查看>>
洛谷P4762 [CERC2014]Virus synthesis(回文自动机+dp)
查看>>
利用PIL和Selenium实现页面元素截图
查看>>
cdoj 树上战争(Battle on the tree) Label:并查集?
查看>>
LightOJ 1236 Pairs Forming LCM(LCM为n的数对个数)
查看>>
快速排序算法 JDK6 和JDK 7
查看>>
原生态Ajax(转)
查看>>
页面间对象传递的方法
查看>>
解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin.
查看>>
js闭包
查看>>
Java编程小技巧集锦
查看>>
Codeforces 856C - Eleventh Birthday
查看>>
数字梯形问题
查看>>
Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)...
查看>>
完全数据库脱机备份+完全数据库脱机备份案列
查看>>
New Concept English there (9)
查看>>
ES6——块级作用域
查看>>