POI操作EXCEL

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值