POI操作EXCEL(一)

转载 2011年01月12日 19:35:00
Jakarta POI 是一套用于访问微软格式文档的Java API。

Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于早在Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。它的官方首页是:http://jakarta.apache.org/poi/hssf/index.html,这里可以下载到它的最新版本和文档。

下面就来看看如何通过Jakarta POI的HSSF操作Excel文件。

操作Excel文件的步骤同JXL类似(关于如何用JXL操作Excel可以看我的另外两篇文章)。

HSSF对Excel的操作主要是通过下面几个对象实现:
HSSFWorkbook    工作簿对象对应于Excel文件
HSSFSheet       Sheet对象对应于Excel中的Sheet
HSSFRow         行对象表示Sheet中的一行(这个对象在JXL中并没有提供)
HSSFCell        单元格对象

操作步骤就是用HSSFWorkbook打开或者创建“Excel文件对象”,用HSSFWorkbook对象返回或者创建Sheet对象,用Sheet对象返回行对象,用行对象得到Cell对象,有了Cell对象就随你读写了。下面来看一个动态生成Excel文件的例子:

//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet("sheet0");
//创建HSSFRow对象
HSSFRow row = sheet.createRow((short)0);
//创建HSSFCell对象
HSSFCell cell=row.createCell((short)0);
//用来处理中文问题
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置单元格的值
cell.setCellValue("单元格中的中文");
//定义你需要的输出流
OutputStream out = new FileOutputStream("viwo.xls");
//输出Excel
wb.write(out);
out.flush();

HSSF读取文件同样还是使用这几个对象,只是把相应的createXXX方法变成了getXXX方法即可。
只要理解了其中原理,不管是读还是写亦或是特定格式都可以轻松实现,正所谓知其然更要知其所以然。

最后附上HSSF官方的QuickGuide:《Busy Developers' Guide to HSSF Features》,虽然是英文的但还是很容易理解的。
http://jakarta.apache.org/poi/hssf/quick-guide.html


一、示例1:
Java代码 复制代码
  1.   
  2.   
  3. package com.cplatform.contants;   
  4.   
  5. import java.io.FileOutputStream;      
  6. import java.io.IOException;      
  7. import java.util.Date;      
  8.   
  9. import org.apache.poi.hssf.usermodel.HSSFCell;      
  10. import org.apache.poi.hssf.usermodel.HSSFCellStyle;      
  11. import org.apache.poi.hssf.usermodel.HSSFDataFormat;      
  12. import org.apache.poi.hssf.usermodel.HSSFRow;      
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;      
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;      
  15. import org.apache.poi.hssf.util.HSSFColor;      
  16.   
  17. public class A {      
  18.     /**   
  19.      * HSSFWorkbook excell的文档对象 HSSFSheet excell的表单 HSSFRow excell的行 HSSFCell   
  20.      * excell的格子单元 HSSFFont excell字体 HSSFName 名称 HSSFDataFormat 日期格式 HSSFHeader   
  21.      * sheet头 HSSFFooter sheet尾 HSSFCellStyle cell样式   
  22.      */    
  23.     public static void main(String[] args) throws IOException {      
  24.         HSSFWorkbook wb = new HSSFWorkbook();      
  25.         // 建立新HSSFWorkbook对象      
  26.         HSSFSheet sheet = wb.createSheet("new sheet");      
  27.         // 建立新的sheet对象      
  28.         // Create a row and put some cells in it.Rows are 0 based.      
  29.         HSSFRow row = sheet.createRow((short0);      
  30.         // 建立新行      
  31.         // Create a cell and put a value in it.      
  32.         HSSFCell cell = row.createCell((short0);      
  33.         // 建立新cell      
  34.         cell.setCellValue(1);// 设置cell的整数类型的值      
  35.         // Or do it on one line.      
  36.         row.createCell((short1).setCellValue(1.2);      
  37.         // 设置cell浮点类型的值      
  38.         row.createCell((short2).setCellValue("test");      
  39.         // 设置cell字符类型的值      
  40.         row.createCell((short3).setCellValue(true);      
  41.         // 设置cell布尔类型的值      
  42.         HSSFCellStyle cellStyle = wb.createCellStyle();      
  43.         // 建立新的cell样式      
  44.         cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));      
  45.         // 设置cell样式为定制的日期格式      
  46.         HSSFCell dCell = row.createCell((short4);      
  47.         dCell.setCellValue(new Date());      
  48.         // 设置cell为日期类型的值      
  49.         dCell.setCellStyle(cellStyle);      
  50.         // 设置该cell日期的显示格式      
  51.         HSSFCell csCell = row.createCell((short5);      
  52.         csCell.setEncoding(HSSFCell.ENCODING_UTF_16);      
  53.         // 设置cell编码解决中文高位字节截断      
  54.         csCell.setCellValue("中文测试_Chinese Words Test");      
  55.   
  56.         // 设置背景色      
  57.         HSSFCellStyle style = wb.createCellStyle();      
  58.         style      
  59.                 .setFillForegroundColor(new HSSFColor.GREY_25_PERCENT()      
  60.                         .getIndex());      
  61.         style      
  62.                 .setFillBackgroundColor(new HSSFColor.GREY_25_PERCENT()      
  63.                         .getIndex());      
  64.         style.setFillPattern(HSSFCellStyle.SPARSE_DOTS);      
  65.         HSSFCell cell1 = row.createCell((short6);      
  66.         cell1.setCellValue("X");      
  67.         cell1.setCellStyle(style);      
  68.   
  69.         // 设置背景色      
  70.         HSSFCellStyle style1 = wb.createCellStyle();      
  71.         style1.setFillForegroundColor(new HSSFColor.GREY_40_PERCENT()      
  72.                 .getIndex());      
  73.         style1.setFillBackgroundColor(new HSSFColor.GREY_40_PERCENT()      
  74.                 .getIndex());      
  75.         style1.setBorderBottom((short1);      
  76.         style1.setBorderTop((short1);      
  77.         style1.setBorderLeft((short1);      
  78.         style1.setBorderRight((short1);      
  79.         /**   
  80.          * 注意这句代码, style1.setFillPattern, 如果你在你的程序中不设置fill pattern,那么   
  81.          * 你上面设置的前景色和背景色就显示不出来.  
  82.          */    
  83.         style1.setFillPattern(HSSFCellStyle.SPARSE_DOTS);      
  84.         HSSFCell cell11 = row.createCell((short7);      
  85.         cell11.setCellValue("X11");      
  86.         cell11.setCellStyle(style1);      
  87.   
  88.         // 数字格式化      
  89.         HSSFCellStyle st = wb.createCellStyle();      
  90.         // 建立新的cell样式      
  91.         st.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));      
  92.         HSSFCell cell12 = row.createCell((short8);      
  93.         cell12.setCellValue((double10000000);      
  94.         cell12.setCellStyle(st);     
  95.   
  96. cell12 .setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断   
  97.   
  98. cell12 .setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串   
  99.   
  100.         row.createCell((short9).setCellType(HSSFCell.CELL_TYPE_ERROR);      
  101.         // 建立错误cell      
  102.         // Write the output to a file      
  103.         FileOutputStream fileOut = new FileOutputStream("D:/workbook.xls");      
  104.         wb.write(fileOut);      
  105.         fileOut.close();      
  106.     }      
  107. }   
  108.   
  109. 二、示例2:   
  110.   
  111. package com.cplatform.contants;   
  112.   
  113. import java.io.FileNotFoundException;   
  114. import java.io.FileOutputStream;   
  115. import java.io.IOException;   
  116. import java.util.Calendar;   
  117.   
  118. import org.apache.poi.hssf.usermodel.HSSFCell;   
  119. import org.apache.poi.hssf.usermodel.HSSFCellStyle;   
  120. import org.apache.poi.hssf.usermodel.HSSFDataFormat;   
  121. import org.apache.poi.hssf.usermodel.HSSFRow;   
  122. import org.apache.poi.hssf.usermodel.HSSFSheet;   
  123. import org.apache.poi.hssf.usermodel.HSSFWorkbook;   
  124.   
  125. /** */  
  126. /**  
  127. * 生成导出Excel文件对象  
  128.  
  129. * @author John.Zhu  
  130. */  
  131. public class XLSExport {   
  132.   
  133. // 设置cell编码解决中文高位字节截断   
  134. private static short XLS_ENCODING = HSSFWorkbook.ENCODING_UTF_16;   
  135.   
  136. // 定制日期格式   
  137. private static String DATE_FORMAT = " m/d/yy "// "m/d/yy h:mm"   
  138.   
  139. // 定制浮点数格式   
  140. private static String NUMBER_FORMAT = " #,##0.00 ";   
  141.   
  142. private String xlsFileName;   
  143.   
  144. private HSSFWorkbook workbook;   
  145.   
  146. private HSSFSheet sheet;   
  147.   
  148. private HSSFRow row;   
  149.   
  150. /** */  
  151. /**  
  152. * 初始化Excel  
  153.  
  154. * @param fileName  
  155. *            导出文件名  
  156. */  
  157. public XLSExport(String fileName) {   
  158.    this.xlsFileName = fileName;   
  159.    this.workbook = new HSSFWorkbook();   
  160.    this.sheet = workbook.createSheet();   
  161. }   
  162.   
  163. /** */  
  164. /**  
  165. * 导出Excel文件  
  166.  
  167. * @throws XLSException  
  168. */  
  169. public void exportXLS() throws Exception {   
  170.    try {   
  171.     FileOutputStream fOut = new FileOutputStream(xlsFileName);   
  172.     workbook.write(fOut);   
  173.     fOut.flush();   
  174.     fOut.close();   
  175.    }   
  176.    catch (FileNotFoundException e) {   
  177.     throw new Exception(" 生成导出Excel文件出错! ", e);   
  178.    }   
  179.    catch (IOException e) {   
  180.     throw new Exception(" 写入Excel文件出错! ", e);   
  181.    }   
  182.   
  183. }   
  184.   
  185. /** */  
  186. /**  
  187. * 增加一行  
  188.  
  189. * @param index  
  190. *            行号  
  191. */  
  192. public void createRow(int index) {   
  193.    this.row = this.sheet.createRow(index);   
  194. }   
  195.   
  196. /** */  
  197. /**  
  198. * 设置单元格  
  199.  
  200. * @param index  
  201. *            列号  
  202. * @param value  
  203. *            单元格填充值  
  204. */  
  205. public void setCell(int index, String value) {   
  206.    HSSFCell cell = this.row.createCell((short) index);   
  207.    cell.setCellType(HSSFCell.CELL_TYPE_STRING);   
  208.    cell.setEncoding(XLS_ENCODING);   
  209.    cell.setCellValue(value);   
  210. }   
  211.   
  212. /** */  
  213. /**  
  214. * 设置单元格  
  215.  
  216. * @param index  
  217. *            列号  
  218. * @param value  
  219. *            单元格填充值  
  220. */  
  221. public void setCell(int index, Calendar value) {   
  222.    HSSFCell cell = this.row.createCell((short) index);   
  223.    cell.setEncoding(XLS_ENCODING);   
  224.    cell.setCellValue(value.getTime());   
  225.    HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式   
  226.    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(DATE_FORMAT)); // 设置cell样式为定制的日期格式   
  227.    cell.setCellStyle(cellStyle); // 设置该cell日期的显示格式   
  228. }   
  229.   
  230. /** */  
  231. /**  
  232. * 设置单元格  
  233.  
  234. * @param index  
  235. *            列号  
  236. * @param value  
  237. *            单元格填充值  
  238. */  
  239. public void setCell(int index, int value) {   
  240.    HSSFCell cell = this.row.createCell((short) index);   
  241.    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);   
  242.    cell.setCellValue(value);   
  243. }   
  244.   
  245. /** */  
  246. /**  
  247. * 设置单元格  
  248.  
  249. * @param index  
  250. *            列号  
  251. * @param value  
  252. *            单元格填充值  
  253. */  
  254. public void setCell(int index, double value) {   
  255.    HSSFCell cell = this.row.createCell((short) index);   
  256.    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);   
  257.    cell.setCellValue(value);   
  258.    HSSFCellStyle cellStyle = workbook.createCellStyle(); // 建立新的cell样式   
  259.    HSSFDataFormat format = workbook.createDataFormat();   
  260.    cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT)); // 设置cell样式为定制的浮点数格式   
  261.    cell.setCellStyle(cellStyle); // 设置该cell浮点数的显示格式   
  262. }   
  263.   
  264. public static void main(String[] args) {   
  265.    System.out.println(" 开始导出Excel文件 ");   
  266.    XLSExport e = new XLSExport("d:/test.xls");   
  267.    e.createRow(0);   
  268.    e.setCell(0" 编号 ");   
  269.    e.setCell(1" 名称 ");   
  270.    e.setCell(2" 日期 ");   
  271.    e.setCell(3" 金额 ");   
  272.    e.createRow(1);   
  273.    e.setCell(01);   
  274.    e.setCell(1" 工商银行 ");   
  275.    e.setCell(2, Calendar.getInstance());   
  276.    e.setCell(3111123.99);   
  277.    e.createRow(2);   
  278.    e.setCell(02);   
  279.    e.setCell(1" 招商银行 ");   
  280.    e.setCell(2, Calendar.getInstance());   
  281.    e.setCell(3222456.88);   
  282.    try {   
  283.     e.exportXLS();   
  284.     System.out.println(" 导出Excel文件[成功] ");   
  285.    }   
  286.    catch (Exception e1) {   
  287.     System.out.println(" 导出Excel文件[失败] ");   
  288.     e1.printStackTrace();   
  289.    }   
  290. }   
  291.   
  292. }   

java poi技术操作excel之读取Excel

代码: package com.csii.rwexcel; import java.io.File; import java.io.FileInputStream; import java.io....
  • u013068377
  • u013068377
  • 2016年06月13日 17:15
  • 10647

Java用POI操作Excel

1、Java 操作Excel可以使用poi或jxl等,poi和jxl的区别是:据说poi功能稍微强大点,效率高(占内存比较大,已空间换时间);pxl功能稍弱,但基本够用,占用资源比较稳定。POI除了可...
  • sanfye
  • sanfye
  • 2015年04月23日 12:33
  • 1846

jsp利用POI直接生成Excel并在页面中导出

 java中导出Excel有两个组件可以使用,一个是jxl,一个是POI,我这里用的是POI。导出是可以在服务器上生成文件,然后下载,也可以利用输出流直接在网页中弹出对话框提示用户保存或下载。生成文件...
  • shangyu79
  • shangyu79
  • 2008年07月21日 09:59
  • 17064

Java使用Apache poi 操作Excel-基本概念与使用

通过POI简化了EXCEL的操作,其中POI提供的WorkBook, spreadsheet,Row,Cell及其实现类来完成对Excel中对应部分(Excel文件,电子表格,行,单元格)的操作(读取...
  • Revivedsun
  • Revivedsun
  • 2017年01月02日 21:50
  • 1540

java POI 操作EXCEL小例子!自己整理了一下,里面属性,功能挺全的!

HSSFWorkbook wb = new HSSFWorkbook();   HSSFSheet sheet = wb.createSheet();   HSSFCellStyle ...
  • lianghx001
  • lianghx001
  • 2014年04月03日 14:04
  • 2248

POI 对excel表格基本操作Demo

今天熟悉了一下POI对excel的一些基本操作与大家分享一下 import java.io.FileOutputStream; import java.io.IOException;...
  • qq_24549805
  • qq_24549805
  • 2016年09月04日 18:15
  • 354

POI实战-java开发excel详解之样式

5.POI样式 在Excel应用中,会需要用到各种样式,包括单元格背景色、边框、高度、宽度、内容相对位置、字体格式、字体大小、字体颜色等等。POI提供了一系列的样式,能满足我们一般开发中的需求。 ...
  • scholar_man
  • scholar_man
  • 2015年09月06日 17:07
  • 2496

poi操作excel(主要为合并单元格和导出excel)

POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。 跨第1行第1个到第2个单元格的操作为 sheet.addMergedRegion(n...
  • l1028386804
  • l1028386804
  • 2013年12月24日 00:40
  • 11634

使用poi操作excel

最近接了个任务,就是要调整EXCEL,而且还要动态调整。。。
  • huangchao064
  • huangchao064
  • 2014年09月27日 22:05
  • 1354

java-使用POI对Excel进行读写操作

HSSFWorkBook:操作2003版本以前的(包括2003版本),扩展名.xls,该类在org.apache.poi:poi中 XSSFWorkBook:操作2007版本以后的(包括2007版本...
  • M_WBCG
  • M_WBCG
  • 2017年07月15日 09:21
  • 765
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POI操作EXCEL(一)
举报原因:
原因补充:

(最多只允许输入30个字)