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导出药品目录 信息。
021医疗项目-模块二:药品目录的导入导出-介绍poi类的更多相关文章
- 023医疗项目-模块二:药品目录的导入导出-从数据库中查出数据用XSSF导出excel并存放在虚拟目录最后下载(包括调试)
我们要实现的效果: 进入到这个页面后,输入要查询的条件,查询出药品表的数据,然后按下导出按钮 ,就会在服务器的一个目录下生成一个药品表的excel表格. 点击"导出"之后 ...
- 027医疗项目-模块二:药品目录的导入导出-导入功能的Action的编写
前一篇文章我们写了Service层,这篇文章我们写一下Action层. 实现的功能: 1:我们先下载模板:然后按照模板里面的规则,插入数据.比如存在d盘. 2:然后浏览找到那个文件,上传上去. 然后把 ...
- 022医疗项目-模块二:药品目录的导入导出-对XSSF导出excel类进行封装
资源全部来源于传智播客. 好的架构师写的程序,就算给刚入门的新手看,新手一看就知道怎么去用.所以我们要对XSSF导出excel类进行封装.这是架构师的工作,但我们也要知道. 我们写一个封装类: 这个类 ...
- 026医疗项目-模块二:药品目录的导入导出-导入功能的Service的编写
这个导入功能要实现的效果是: 思路是: 因为我们最后是在Action层中调用的HxlsRead工具,这个工具传入的就是我们要实现的上一篇文章说到的实现了HxlsOptRowsInterface接口的类 ...
- 025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装
上一篇文章提过,HSSF的用户模式会导致读取海量数据时很慢,所以我们采用的是事件驱动模式.这个模式类似于xml的sax解析.需要实现一个接口,HSSFListener接口. 原理:根据excel底层存 ...
- 024医疗项目-模块二:药品目录的导入导出-HSSF导入类的学习
我们之前学习了怎么把数据的数据导出来保存到Excle中,这篇文章我们学习怎么Excel数据导出然后插入到数据库中. 我们先学习HSSF怎么用来导出数据. 看官方教程步骤如下: 第一步: 创建一个wor ...
- 044医疗项目-模块四:采购单模块—采购单保存(Dao,Service,Action三层)
我们上上一篇文章(042医疗项目-模块四:采购单模块-采购单明细添加查询,并且把数据添加到数据库中)做的工作是把数据插入到了数据库,我们这篇文章做的是042医疗项目-模块四:采购单模块-采购单明细添加 ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
随机推荐
- SCOM Visio监控 与sharepoint 2010 整合
激活sharepoint 2010的企业版网站功能 在sharepoint 前端服务器安装:OpsMgrDataModule.msi,安装好后可以看到如下东东: 在Sharepoint前端服务器中启动 ...
- RGui的http代理设置
办公电脑环境需要http代理访问大网,使用R语言安装包时老是无法连接网络,后来从网上发现解决方法很简单,只需在启动RGui.exe的命令行上加上启动参数就可以了. "C:\Program F ...
- 3.0之后在LinearLayout里增加分割线
android:divider="@drawable/shape"<!--分割线图片--> android:showDividers="middle|begi ...
- Java.lang.OutOfMemoryError处理
此错误对于新手做项目的时候经常会发生,而且不容易处理 默认情况下,每个android程序的dailvik虚拟机的最大堆空间大小为16M 当加载的图片太多或图片过大时经常出现OOM问题 而出现此类问题最 ...
- Android 在外部存储读写文件
本文主要介绍android中如何在外部存储读写数据 sd卡的路径 sdcard:2.3之前的sd卡路径 mnt/sdcard:4.3之前的sd卡路径 storage/sdcard:4.3之后的sd卡路 ...
- 【读书笔记】iOS-验证应用内支付的凭证注意事项
1,简单来说,越狱后的手机由于没有沙盒作为保护,黑客可以对系统进行任意的修改,所以,在支付过程中,苹果返回的已付款成功的凭证可能是伪造的.客户端拿到付款凭证之后,还需要将凭证上传到自己的服务器,进行二 ...
- 卸载openfire
首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...
- Python学习三---序列、列表、元组
一.序列 1.1.序列概念 pythn中最基本的数据结构是序列(sequence). 序列中每个元素被分配一个序号-元素索引,第一个索引是0,第二个是1,以此类推.类似JAVA中数组和集合中的下标. ...
- Mac terminal从bash切换到zsh
0.预备知识 echo $SHELL命令可以查看当前正在使用什么shell 默认情况下(mbp 10.10.5)使用bash作为默认shell,然而也自带zsh,which zsh命令可以查看zsh的 ...
- centos 安装完Nginx后,为什么访问不了?
很多时候,安装完成后,服务也启动了 但是访问不了 看看是不是防火墙开启了: 本地试下端口是否可访问telnet 192.168.4.155 80 CentOS 7默认使用的是firewall作为防火墙 ...