POI操作EXCEL(二)

原文转自:http://www.tqcto.com/article/code/295025.html

java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位。或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼。还好 在POI HSSF中考虑到这个问题,可以设置encoding为双字节。

POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。如果用Jakarta ant编译和运行,下载apache Jakarta POI的release中的src包,它里面已经为你生成好了build文件了。只要运行ant就可以了(ant 的安装和使用在此不说了)。如果是用Jbuilder 运行,请在新建的项目中加入poi包。以Jbuilder6为例,选择Tools菜单项的config libraries...选项,新建一个lib。在弹出的菜单中选择poi包,如这个jakarta-poi-1.5.1-final- 20020820.jar,把poi添加到jbuilder中。然后,右键点击你的项目,在project的properties菜单中path的 required Libraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。如果你仅仅是为了熟悉POI hssf的使用,可以直接看POI的samples包中的源代码,并且运行它。hssf的各种对象都有例程的介绍。hssf提供的例程在 org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。如果 你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。

这里只对部分例程的实现做介绍。

HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:

HSSFWorkbook excell的文档对象

HSSFSheet excell的表单

HSSFRow excell的行

HSSFCell excell的格子单元

HSSFFont excell字体

HSSFName 名称

HSSFDataFormat 日期格式

在poi1.7中才有以下2项:

HSSFHeader sheet头

HSSFFooter sheet尾

和这个样式

HSSFCellStyle cell样式

辅助操作包括

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 错误信息表

仔细看org.apache.poi.hssf包的结构,不难发现HSSF的内部实现遵循的是MVC模型。

这里我用Rose把org.apache.poi.hssf.usermodel包中的对象反向导入并根据相互关系作了整理,详见下面两图:

图1 基本对象

从中不难可以发现每一个基本对象都关联了一个Record对象。Record对象是一个参考Office格式的相关记录。

图2 HSSFWorkbook

HSSFWorkbook即是一个Excell对象。这幅类图体现的是HSSFWorkbook和基本对象的相互关系。可见,许多对象中也建立了 Workbook的引用。还需要注意的是在HSSFWorkbook和HSSFSheet中建立了log机制POILogger,而且POILogger 也是使用apache Log4J实现的。

先看poi的examples包中提供的最简单的例子,建立一个空xls文件。

Java代码  

  1. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class NewWorkbook
  5. {
  6. public static void main(String[] args)
  7. throws IOException
  8. {
  9. HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
  10. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  11. wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中
  12. fileOut.close();
  13. }
  14. }
  15. 通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。
  16. import org.apache.poi.hssf.usermodel.*;
  17. import java.io.FileOutputStream;
  18. import java.io.IOException;
  19. public class CreateCells
  20. {
  21. public static void main(String[] args)
  22. throws IOException
  23. {
  24. HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象
  25. HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象
  26. // Create a row and put some cells in it. Rows are 0 based.
  27. HSSFRow row = sheet.createRow((short)0);//建立新行
  28. // Create a cell and put a value in it.
  29. HSSFCell cell = row.createCell((short)0);//建立新cell
  30. cell.setCellValue(1);//设置cell的整数类型的值
  31. // Or do it on one line.
  32. row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值
  33. row.createCell((short)2).setCellValue("test");//设置cell字符类型的值
  34. row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值
  35. HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式
  36. cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式
  37. HSSFCell dCell =row.createCell((short)4);
  38. dCell.setCellValue(new Date());//设置cell为日期类型的值
  39. dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式
  40. HSSFCell csCell =row.createCell((short)5);
  41. csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断
  42. csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串
  43. row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell
  44. // Write the output to a file
  45. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  46. wb.write(fileOut);
  47. fileOut.close();
  48. }
  49. }
  50. 我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子,我们可以清楚的看到xls文件从大到小包 括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须 设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。
  51. 其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一 个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。
  52. 另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现 HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2 是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。
  53. 因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。
  54. ======================================================
  55. 利用Java 创建和读取Excel文档
  56. 为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站点是: http://jakarta.apache.org/poi/
  57. 示例1将演示如何利用Jakarta POI API 创建Excel 文档。
  58. 示例1程序如下:
  59. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  60. import org.apache.poi.hssf.usermodel.HSSFSheet;
  61. import org.apache.poi.hssf.usermodel.HSSFRow;
  62. import org.apache.poi.hssf.usermodel.HSSFCell;
  63. import java.io.FileOutputStream;
  64. public class CreateXL {
  65. /** Excel 文件要存放的位置,假定在D盘JTest目录下*/
  66. public static String outputFile="D:/JTest/ gongye.xls";
  67. public static void main(String argv[])
  68. {
  69. try
  70. {
  71. // 创建新的Excel 工作簿
  72. HSSFWorkbook workbook = new HSSFWorkbook();
  73. // 在Excel工作簿中建一工作表,其名为缺省值
  74. // 如要新建一名为"效益指标"的工作表,其语句为:
  75. // HSSFSheet sheet = workbook.createSheet("效益指标");
  76. HSSFSheet sheet = workbook.createSheet();
  77. // 在索引0的位置创建行(最顶端的行)
  78. HSSFRow row = sheet.createRow((short)0);
  79. //在索引0的位置创建单元格(左上端)
  80. HSSFCell cell = row.createCell((short) 0);
  81. // 定义单元格为字符串类型
  82. cell.setCellType(HSSFCell.CELL_TYPE_STRING);
  83. // 在单元格中输入一些内容
  84. cell.setCellValue("增加值");
  85. // 新建一输出文件流
  86. FileOutputStream fOut = new FileOutputStream(outputFile);
  87. // 把相应的Excel 工作簿存盘
  88. workbook.write(fOut);
  89. fOut.flush();
  90. // 操作结束,关闭文件
  91. fOut.close();
  92. System.out.println("文件生成...");
  93.  }catch(Exception e) {
  94. System.out.println("已运行 xlCreate() : " + e );
  95. }
  96. }
  97. }
  98. 读取Excel文档中的数据
  99. 示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为gongye.xls的Excel文件。
  100. 示例2程序如下:
  101. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  102. import org.apache.poi.hssf.usermodel.HSSFSheet;
  103. import org.apache.poi.hssf.usermodel.HSSFRow;
  104. import org.apache.poi.hssf.usermodel.HSSFCell;
  105. import java.io.FileInputStream;
  106. public class ReadXL {
  107. /** Excel文件的存放位置。注意是正斜线*/
  108. public static String fileToBeRead="D:/JTest/ gongye.xls";
  109. public static void main(String argv[]){
  110. try{
  111. // 创建对Excel工作簿文件的引用
  112. HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
  113. // 创建对工作表的引用。
  114. // 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")
  115. HSSFSheet sheet = workbook.getSheet("Sheet1");
  116. // 也可用getSheetAt(int index)按索引引用,
  117. // 在Excel文档中,第一张工作表的缺省索引是0,
  118. // 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
  119. // 读取左上端单元
  120. HSSFRow row = sheet.getRow(0);
  121. HSSFCell cell = row.getCell((short)0);
  122. // 输出单元内容,cell.getStringCellValue()就是取所在单元的值
  123. System.out.println("左上端单元是: " + cell.getStringCellValue());
  124. }catch(Exception e) {
  125. System.out.println("已运行xlRead() : " + e );
  126. }
  127. }
  128. }
  129. 设置单元格格式
  130. 在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java
  131. 中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式:
  132.   1、创建字体,设置其为红色、粗体:
  133. HSSFFont font = workbook.createFont();
  134. font.setColor(HSSFFont.COLOR_RED);
  135. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  136. 2、创建格式
  137. HSSFCellStyle cellStyle= workbook.createCellStyle();
  138. cellStyle.setFont(font);
  139. 3、应用格式
  140. HSSFCell cell = row.createCell((short) 0);
  141. cell.setCellStyle(cellStyle);
  142. cell.setCellType(HSSFCell.CELL_TYPE_STRING);
  143. cell.setCellValue("标题 ");
  144.   总之,如本篇文章所演示的一样,Java程序员不必担心Excel工作表中的数据了,利用Jakarta POI API,
  145. 我们就可以轻易的在程序中存取Excel文档。
  146. ==============================================
  147. 首先说说现在我所知道的Java编辑Excel文件的两大开源工具:
  148. jakarta POI和JavaExcelAPI(简称JXL),这两套工具我都试用了一这段时间,感觉各有优劣吧。POI在某些细节有些小Bug并且不支持写入图片,其他方面都挺不错的;
  149. JXL就惨了,除了支持写入图片外,我暂时看不到它比POI好的地方,我碰到的主要的问题就是对公式支持不是很好,很多带有公式的Excel文件用 JXL打开后,公式就丢失了(比如now(),today()),在网上看到其他大虾评论说JXL写入公式也有问题,另外,JXL操作Excel文件的效 率比POI低一点。经过比较后,我选择了POI开发我的项目。
  150. 现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。
  151. 1、设置分页符的bug
  152. POI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。
  153. Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。
  154. 解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。
  155. 如果sheet是由POI生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的 PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel 插入一个分页符来触发POI为rowBreaks创建实例。
  156. 2、如何拷贝行
  157. 我在gmane.org的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:
  158. //注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new
  159. public void copyRows
  160. (String pSourceSheetName,
  161. String pTargetSheetName,
  162. int pStartRow, int pEndRow,
  163. int pPosition)
  164. {
  165. HSSFRow sourceRow = null;
  166. HSSFRow targetRow = null;
  167. HSSFCell sourceCell = null;
  168. HSSFCell targetCell = null;
  169. HSSFSheet sourceSheet = null;
  170. HSSFSheet targetSheet = null;
  171. Region region = null;
  172. int cType;
  173. int i;
  174. short j;
  175. int targetRowFrom;
  176. int targetRowTo;
  177. if ((pStartRow == -1) || (pEndRow == -1))
  178. {
  179. return;
  180. }
  181. sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);
  182. targetSheet = this.fWorkbook.getSheet(pTargetSheetName);
  183. //拷贝合并的单元格
  184. for (i = 0; i < sourceSheet.getNumMergedRegions(); i++)
  185. {
  186. region = sourceSheet.getMergedRegionAt(i);
  187. if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow))
  188. {
  189. targetRowFrom = region.getRowFrom() - pStartRow + pPosition;
  190. targetRowTo = region.getRowTo() - pStartRow + pPosition;
  191. region.setRowFrom(targetRowFrom);
  192. region.setRowTo(targetRowTo);
  193. targetSheet.addMergedRegion(region);
  194. }
  195. }
  196. //设置列宽
  197. for (i = pStartRow; i <= pEndRow; i++)
  198. {
  199. sourceRow = sourceSheet.getRow(i);
  200. if (sourceRow != null)
  201. {
  202. for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)
  203. {
  204. targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));
  205. }
  206. break;
  207. }
  208. }
  209. //拷贝行并填充数据
  210. for (;i <= pEndRow; i++)
  211. {
  212. sourceRow = sourceSheet.getRow(i);
  213. if (sourceRow == null)
  214. {
  215. continue;
  216. }
  217. targetRow = targetSheet.createRow(i - pStartRow + pPosition);
  218. targetRow.setHeight(sourceRow.getHeight());
  219. for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)
  220. {
  221. sourceCell = sourceRow.getCell(j);
  222. if (sourceCell == null)
  223. {
  224. continue;
  225. }
  226. targetCell = targetRow.createCell(j);
  227. targetCell.setEncoding(sourceCell.getEncoding());
  228. targetCell.setCellStyle(sourceCell.getCellStyle());
  229. cType = sourceCell.getCellType();
  230. targetCell.setCellType(cType);
  231. switch (cType)
  232. {
  233. case HSSFCell.CELL_TYPE_BOOLEAN:
  234. targetCell.setCellValue(sourceCell.getBooleanCellValue());
  235. break;
  236. case HSSFCell.CELL_TYPE_ERROR:
  237. targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
  238. break;
  239. case HSSFCell.CELL_TYPE_FORMULA:
  240. //parseFormula这个函数的用途在后面说明
  241. targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));
  242. break;
  243. case HSSFCell.CELL_TYPE_NUMERIC:
  244. targetCell.setCellValue(sourceCell.getNumericCellValue());
  245. break;
  246. case HSSFCell.CELL_TYPE_STRING:
  247. targetCell.setCellValue(sourceCell.getStringCellValue());
  248. break;
  249. }
  250. }
  251. }
  252. }
  253. 这个函数有两个问题暂时无法解决:
  254. a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?
  255. b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!
  256. 3、公式的问题
  257. POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过 getCellFormula()取出来的值就是now(ATTR(semiVolatile))和today(ATTR (semiVolatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原 因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:
  258. private String parseFormula(String pPOIFormula)
  259. {
  260. final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$
  261. StringBuffer result = null;
  262. int index;
  263. result = new StringBuffer();
  264. index = pPOIFormula.indexOf(cstReplaceString);
  265. if (index >= 0)
  266. {
  267. result.append(pPOIFormula.substring(0, index));
  268. result.append(pPOIFormula.substring(index + cstReplaceString.length()));
  269. }
  270. else
  271. {
  272. result.append(pPOIFormula);
  273. }
  274. return result.toString();
  275. }
  276. 至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!
  277. 4、向Excel写入图片的问题。
  278. 我上POI论坛查相关帖子,得到两种结论:
  279. 1、不支持写入图片;
  280. 2、支持写入图片,通过EscherGraphics2d这个Class实现。于是我就去查EscherGraphics2d这个Class,发现 这个Class提供了N个drawImage方法,喜出望外的我开始写代码,结果调了一天,一直看不到效果,黔驴技穷的我在万般无奈下只好跟踪进 drawImage这个函数内部,经过N个函数调用后在最底层函数发现了最终答案:
  281. public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
  282. int sx2, int sy2, Color bgColor, ImageObserver imageobserver)
  283. {
  284. if (logger.check( POILogger.WARN ))
  285. logger.log(POILogger.WARN,"drawImage() not supported");
  286. return true;
  287. }
  288. 所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多时候就可以不必重蹈我的 覆辙了。既然POI不能写入图片,那我们只能把目光投向JXL,我用JXL写入图片功能是实现了,付出的代价是now()和today()这些函数丢失掉 了,鱼与熊掌不能兼得吧。
  289. ==========================jsp操作===============================
  290. <%@ page contentType="application/msexcel;charset=gb2312" %>
  291. response.setHeader("Content-disposition","inline; filename=test1.xls");
  292. //以上这行设定传送到前端浏览器时的档名为test1.xls
  293. //就是靠这一行,让前端浏览器以为接收到一个excel档
  294. 下面正常显示要转化的表
  295. --------------------------------------------------------------------------
  296. 介绍:
  297. Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。
  298. 因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI本身
  299. 带的一个Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。
  300. POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页
  301. http://jakarta.apache.org/poi/hssf/index.html
  302. 下面的介绍是基于以下地址的翻译:
  303. http://jakarta.apache.org/poi/hssf/quick-guide.html
  304. 目前的版本为1.51应该是很长时间之内的一个稳定版,但HSSF提供的Sample不是基于
  305. 1.51所写,所以使用的时候需要适当的注意.
  306. 其实POI下面的几个子项目侧重不同读写 Word 的HDF正在开发当中.
  307. XML下的FOP(http://xml.apache.org/fop/index.html)
  308. 可以输出pdf文件,也是比较好的一个工具
  309. 目录:
  310. 创建一个workbook
  311. 创建一个sheet
  312. 创建cells
  313. 创建日期cells
  314. 设定单元格格式
  315. 说明:
  316. 以下可能需要使用到如下的类
  317. import org.apache.poi.hssf.usermodel.HSSFCell;
  318. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  319. import org.apache.poi.hssf.usermodel.HSSFDataFormat;
  320. import org.apache.poi.hssf.usermodel.HSSFFont;
  321. import org.apache.poi.hssf.usermodel.HSSFRow;
  322. import org.apache.poi.hssf.usermodel.HSSFSheet;
  323. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  324. import org.apache.poi.hssf.util.HSSFColor;
  325. 创建workbook
  326. HSSFWorkbook wb = new HSSFWorkbook();
  327. //使用默认的构造方法创建workbook
  328. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  329. //指定文件名
  330. wb.write(fileOut);
  331. //输出到文件
  332. fileOut.close();
  333. 创建一个sheet
  334. HSSFWorkbook wb = new HSSFWorkbook();
  335. HSSFSheet sheet1 = wb.createSheet("new sheet");
  336. //workbook创建sheet
  337. HSSFSheet sheet2 = wb.createSheet("second sheet");
  338. //workbook创建另外的sheet
  339. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  340. wb.write(fileOut);
  341. fileOut.close();
  342. 创建cells
  343. HSSFWorkbook wb = new HSSFWorkbook();
  344. HSSFSheet sheet = wb.createSheet("new sheet");
  345. //注意以下的代码很多方法的参数是short 而不是int 所以需要做一次类型转换
  346. HSSFRow row = sheet.createRow((short)0);
  347. //sheet 创建一行
  348. HSSFCell cell = row.createCell((short)0);
  349. //行创建一个单元格
  350. cell.setCellValue(1);
  351. //设定单元格的值
  352. //值的类型参数有多中double ,String ,boolean,
  353. row.createCell((short)1).setCellValue(1.2);
  354. row.createCell((short)2).setCellValue("This is a string");
  355. row.createCell((short)3).setCellValue(true);
  356. // Write the output to a file
  357. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  358. wb.write(fileOut);
  359. fileOut.close();
  360. 创建日期cells
  361. HSSFWorkbook wb = new HSSFWorkbook();
  362. HSSFSheet sheet = wb.createSheet("new sheet");
  363. HSSFRow row = sheet.createRow((short)0);
  364. HSSFCell cell = row.createCell((short)0);
  365. //设定值为日期
  366. cell.setCellValue(new Date());
  367. HSSFCellStyle cellStyle = wb.createCellStyle();
  368. //指定日期显示格式
  369. cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));
  370. cell = row.createCell((short)1);
  371. cell.setCellValue(new Date());
  372. //设定单元格日期显示格式
  373. cell.setCellStyle(cellStyle);
  374. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
  375. wb.write(fileOut);
  376. fileOut.close();
  377. 设定单元格格式
  378. 单元格格式的设定有很多形式包括单元格的对齐方式,内容的字体设置,
  379. 单元格的背景色等,因为形式比较多,只举一些例子.以下的例子在
  380. POI1.5中可能会有所改变具体查看API.
  381. ..........
  382. // Aqua background
  383. HSSFCellStyle style = wb.createCellStyle();
  384. //创建一个样式
  385. style.setFillBackgroundColor(HSSFCellStyle.AQUA);
  386. //设定此样式的的背景颜色填充
  387. style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
  388. //样式的填充类型。
  389. //有多种式样如:
  390. //HSSFCellStyle.BIG_SPOTS
  391. //HSSFCellStyle.FINE_DOTS
  392. //HSSFCellStyle.SPARSE_DOTS等
  393. style.setAlignment(HSSFCellStyle.ALIGN_CENTER );
  394. //居中对齐
  395. style.setFillBackgroundColor(HSSFColor.GREEN.index);
  396. //设定单元个背景颜色
  397. style.setFillForegroundColor(HSSFColor.RED.index);
  398. //设置单元格显示颜色
  399. HSSFCell cell = row.createCell((short) 1);
  400. cell.setCellValue("X");
  401. cell.setCellStyle(style);
  402. -----------------------------------------------------------------
  403. 加上response.setContentType("Application/msexcel");
  404. response.setHeader("Content-disposition","attachment; filename=book.xls" );
  405. 然后提交给它的时候会时候会提示下载,
  406. 下载的就是生成的EXCEL文件。
  407. -----------------------------------------------------------
  408. 有趣的是,对一个html文件(数据在表格中),当把后缀改为xls后,打开文件即是。
  409. ------------------------------------------
  410. >>加上response.setContentType("Application/msexcel");
  411. >>     response.setHeader("Content-disposition","attachment; >>filename=book.xls" );
  412. >>然后提交给它的时候会时候会提示下载,
  413. >>下载的就是生成的EXCEL文件。
  414. book.xls的存放路径应该是哪里?
  415. ----------------------------------------------------------------
  416. 使用poi的hssf生成一个excel文件以后
  417. 有一个主类Workbook(相当于一个excel文件)的方法
  418. Workbook.write(OutputStream)可以写到response.getOutputStream()里面
  419. 如果事先设置response的contentType为excel和下载的附件名称就可下载excel
  420. HSSFWorkbook book = _proxy.expertExcel(_formBean,_login);
  421. if(book!=null)
  422. {
  423. response.setContentType ( "application/ms-excel" ) ;
  424. response.setHeader ( "Content-Disposition" ,
  425. "attachment;filename="+new String("导出Excel.xls".getBytes(),"iso-8859-1"))
  426. ;
  427. book.write(response.getOutputStream());
  428. }
  429. 其中expertExcel无非是从数据库或者其他地方获取数据创建excel即可.
  430. ---------------------------------------------------------------
  431. response.setHeader("Content-disposition","attachment; filename=book.xls" );
  432. 原来加上attachment浏览器就会提示保存或者打开,是我想要的。Thanks all.
  433. -------------------------------------------------------------------------
  434. 1.用poi生成Excel文件,和WORD文档都可以,是个不错的方法,参见poi网站,楼上的朋友描述的很清楚了,此方法适用于生
  435. 成,读取,解析xls文件
  436. 2.另外一种更简单的方法:只适用于显示用的EXCEL文件格式,生成常规的html文件格式,后缀命名方式为.xls即可.
  437. 3.espreadsheet适用于网上即时的excel文件交互操作,生成,解析,保存修改,但需要购买
  438. -------------------------------------------------------------------------
  439. 生成一个rtf文件,然后扩展名写".doc",OK
  440. -----------------------------------------------------------
  441. 用这个组件向excel写数据时,总是出现中文乱码情况,请问怎样解决?
  442. 源代码:
  443. HSSFWorkbook wb = new HSSFWorkbook();
  444. HSSFSheet sheet = wb.createSheet("new sheet");
  445. HSSFHeader header = sheet.getHeader();
  446. header.setCenter("Center Header");
  447. HSSFRow row = sheet.createRow((short)0);
  448. HSSFCell cell = row.createCell((short)0);
  449. cell.setCellValue(1);
  450. row.createCell((short)1).setCellValue(1.2123654);
  451. row.createCell((short)2).setCellValue("This is a string");
  452. row.createCell((short)3).setCellValue(true);
  453. row = sheet.createRow((short)1);
  454. cell = row.createCell((short)0);
  455. cell.setCellValue(new Date());
  456. row.createCell((short)1).setCellValue(str);
  457. row.createCell((short)2).setCellValue("This我是一个好人string");
  458. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");
  459. wb.write(fileOut);
  460. fileOut.close();
  461. 当我打开这个"d:/filename.xls"文件时,其中写入的中文全都是乱码!!!
  462. 如何解决???
  463. ----------------------------------------------------------------------
  464. 源代码:
  465. HSSFWorkbook wb = new HSSFWorkbook();
  466. HSSFSheet sheet = wb.createSheet("new sheet");
  467. HSSFHeader header = sheet.getHeader();
  468. header.setCenter("Center Header");
  469. HSSFRow row = sheet.createRow((short)0);
  470. HSSFCell cell = row.createCell((short)0);
  471. cell.setCellValue(1);
  472. row.createCell((short)1).setCellValue(1.2123654);
  473. row.createCell((short)2).setCellValue("This is a string");
  474. row.createCell((short)3).setCellValue(true);
  475. row = sheet.createRow((short)1);
  476. cell = row.createCell((short)0);
  477. cell.setCellValue(new Date());
  478. String str = new String("我是一个好人!!!");
  479. row.createCell((short)1).setCellValue(str);
  480. row.createCell((short)2).setCellValue("This我是一个好人string");
  481. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");
  482. wb.write(fileOut);
  483. fileOut.close();
  484. 当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!
  485. 请问如何解决?
  486. ---------------------------------------------------------------------
  487. <%@ page contentType="application/msexcel;charset=gb2312" %>
  488. response.setHeader("Content-disposition","inline; filename=***.xls");就可以了,要是想要word 就
  489. <%@ page contentType="application/msword;charset=gb2312" %>
  490. response.setHeader("Content-disposition","inline; filename=test1.xls");
  491. -------------------------------------------------------------------
  492. 引用 pengruihua 说:
  493. 有趣的是,对一个html文件(数据在表格中),当把后缀改为xls后,打开文件即是。
  494. 这个只能说明excel强,这样写得xls,在JXL或者POI中都是不认的。
  495. 加一句,用POI写Excel有点问题,当反复读写一个excel文件的时候,读的速度会越来越慢。
  496. 我的一个生成excel的就是,到了几千条记录的时候慢得就不能接受了,最后只好先生成csv的文本,再将文本导成xls
  497. 文件
  498. ---------------------------------------------------------------------------
  499. 引用 java_century 说:
  500. 源代码:
  501. HSSFWorkbook wb = new HSSFWorkbook();
  502. HSSFSheet sheet = wb.createSheet("new sheet");
  503. HSSFHeader header = sheet.getHeader();
  504. header.setCenter("Center Header");
  505. HSSFRow row = sheet.createRow((short)0);
  506. HSSFCell cell = row.createCell((short)0);
  507. cell.setCellValue(1);
  508. row.createCell((short)1).setCellValue(1.2123654);
  509. row.createCell((short)2).setCellValue("This is a string");
  510. row.createCell((short)3).setCellValue(true);
  511. row = sheet.createRow((short)1);
  512. cell = row.createCell((short)0);
  513. cell.setCellValue(new Date());
  514. String str = new String("我是一个好人!!!");
  515. row.createCell((short)1).setCellValue(str);
  516. row.createCell((short)2).setCellValue("This我是一个好人string");
  517. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");
  518. wb.write(fileOut);
  519. fileOut.close();
  520. 当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!
  521. 请问如何解决?
  522. 使用POI这样处理中文
  523. HSSFCell cell = row.createCell((short)1);
  524. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  525. cell.setCellValue("中文");

原文转自:编程技术

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-20 01:00:30

POI操作EXCEL(二)的相关文章

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.

POI 操作Excel 异常org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a c

POI 操作Excel 出现如下异常 org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a content type part 代码如下 public boolean parseToExcel(String oldFileName,String newFileName){ Map<Object,Object> map = new HashMap<Object,Object&

POI操作EXCEL之导出Excel(设置有效性,下拉列表引用)

本人使用的是poi-bin-3.10-FINAL-20140208.zip 版本的poi以下是程序关键代码: //需要引用的类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import ja

第七周作业 POI操作Excel,world文档

先来说说jxl与poi的区别. 相同点都是操作EXcel的工具,但jxl不常用原因有:jxl没有人维护,操作excel效力低下,只支持03及其以前的版本的excel,对图片的支持不完整. 同poi比较而言,poi效率高功能强大,支持xlsx,xls即支持所有的版本.而且操作大数据效率比较高,因为他对大数据的操作做了相应的优化. 下面来个简单地实现:poi操作Excel的功能 简单的单元测试类:实现的功能是向excel文件中写入数据 1 @Test 2 public void test1() th

POI操作Excel异常Cannot get a text value from a numeric cell

控制台抛出异常:java.lang.IllegalStateException: Cannot get a text value from a numeric cell 在java中用POI解析excel文件时出现以上报错,表示无法从一个数值类型的单元格获得文本类型的值. POI操作Excel时数据Cell有不同的类型,当我们试图从一个数字类型的Cell读取出一个字符串并写入数据库时,就会出现Cannot get a text value from a numeric cell的异常错误. 解决