POI操作Excel

POI操作Excel
POI操作Excel

POI操作Excel----------

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

POI可以到https://www.360docs.net/doc/4d8340326.html,下载到。编译好的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提供的例程在https://www.360docs.net/doc/4d8340326.html,ermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。

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

HSSF提供给用户使用的对象在https://www.360docs.net/doc/4d8340326.html,ermodel包中,主要部分包括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把https://www.360docs.net/doc/4d8340326.html,ermodel包中的对象反向导入并根据相互关系作了整理,详见下面两图:

图1 基本对象

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

图2 HSSFWorkbook

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

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

Java代码

1. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook;

2.

3. import java.io.FileOutputStream;

4.

5. import java.io.IOException;

6.

7. public class NewWorkbook

8.

9. {

10.

11. public static void main(String[] args)

12.

13. throws IOException

14.

15. {

16.

17. HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象

18.

19. FileOutputStream fileOut = new FileOutputStream("workbook.xls");

20.

21. wb.write(fileOut);//把Workbook对象输出到文件workbook.xls中

22.

23. fileOut.close();

24.

25. }

26.

27. }

28.

29. 通过这个例子,我们建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例

子。

30.

31. import https://www.360docs.net/doc/4d8340326.html,ermodel.*;

32.

33. import java.io.FileOutputStream;

34.

35. import java.io.IOException;

36.

37. public class CreateCells

38.

39. {

40.

41. public static void main(String[] args)

42.

43. throws IOException

44.

45. {

46.

47. HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook对象

48.

49. HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet对象

50.

51. // Create a row and put some cells in it. Rows are 0 based.

52.

53. HSSFRow row = sheet.createRow((short)0);//建立新行

54.

55. // Create a cell and put a value in it.

56.

57. HSSFCell cell = row.createCell((short)0);//建立新cell

58.

59. cell.setCellValue(1);//设置cell的整数类型的值

61. // Or do it on one line.

62.

63. row.createCell((short)1).setCellValue(1.2);//设置cell浮点类型的值

64.

65. row.createCell((short)2).setCellValue("test");//设置cell字符类型的值

66.

67. row.createCell((short)3).setCellValue(true);//设置cell布尔类型的值

68.

69. HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell样式

70.

71. cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//设置cell样式为定制的日期格式

72.

73. HSSFCell dCell =row.createCell((short)4);

74.

75. dCell.setCellValue(new Date());//设置cell为日期类型的值

76.

77. dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式

78.

79. HSSFCell csCell =row.createCell((short)5);

80.

81. csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//设置cell编码解决中文高位字节截断

82.

83. csCell.setCellValue("中文测试_Chinese Words Test");//设置中西文结合字符串

84.

85. row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立错误cell

86.

87. // Write the output to a file

88.

89. FileOutputStream fileOut = new FileOutputStream("workbook.xls");

90.

91. wb.write(fileOut);

92.

93. fileOut.close();

94.

95. }

96.

97. }

98.

99. 我稍微修改了原来的examples包中的CreateCells类写了上面的功能测试类。通过这个例子,我们可以清楚

的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。

101. 其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就没有。运行测试熟悉代码或者使用它做项目时请注意POI的版本。

102.

103. 另外需要注意的是HSSF也有它的对xls基于事件的解析。可以参考例程中的EventExample.java。它通过实现HSSFListener完成从普通流认知Xls中包含的内容,在apache Cocoon中的

org.apache.cocoon.serialization.HSSFSerializer中用到了这个解析。因为Cocoon2 是基于事件的,所以POI为了提供快速的解析也提供了相应的事件。当然我们自己也可以实现这个事件接口。

104.

105. 因为POI还不是一个足够成熟的项目,所以有必要做进一步的开发和测试。但是它已经为我们用纯java操作ole2对象提供了可能,而且克服了ole对象调用的缺陷,提供了服务器端的Excel解决方案。

106. ======================================================

107.

108. 利用Java 创建和读取Excel文档

109.

110. 为了保证示例程序的运行,必须安装Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站点是: https://www.360docs.net/doc/4d8340326.html,/poi/

111.

112.

113. 示例1将演示如何利用Jakarta POI API 创建Excel 文档。

114.

115.

116. 示例1程序如下:

117. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook;

118. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet;

119. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow;

120. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell;

121. import java.io.FileOutputStream;

122. public class CreateXL {

123. /** Excel 文件要存放的位置,假定在D盘JTest目录下*/

124. public static String outputFile="D:/JTest/ gongye.xls";

125. public static void main(String argv[])

126. {

127. try

128. {

129. // 创建新的Excel 工作簿

130. HSSFWorkbook workbook = new HSSFWorkbook();

131. // 在Excel工作簿中建一工作表,其名为缺省值

132. // 如要新建一名为"效益指标"的工作表,其语句为:

133. // HSSFSheet sheet = workbook.createSheet("效益指标");

134. HSSFSheet sheet = workbook.createSheet();

135. // 在索引0的位置创建行(最顶端的行)

136. HSSFRow row = sheet.createRow((short)0);

137. //在索引0的位置创建单元格(左上端)

138. HSSFCell cell = row.createCell((short) 0);

139. // 定义单元格为字符串类型

140. cell.setCellType(HSSFCell.CELL_TYPE_STRING);

141. // 在单元格中输入一些内容

142. cell.setCellValue("增加值");

143. // 新建一输出文件流

144. FileOutputStream fOut = new FileOutputStream(outputFile);

145. // 把相应的Excel 工作簿存盘

146. workbook.write(fOut);

147. fOut.flush();

148. // 操作结束,关闭文件

149. fOut.close();

150. System.out.println("文件生成...");

151.

152.

153. }catch(Exception e) {

154. System.out.println("已运行xlCreate() : " + e );

155. }

156. }

157. }

158.

159.

160. 读取Excel文档中的数据

161. 示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为gongye.xls的Excel 文件。

162. 示例2程序如下:

163. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook;

164. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet;

165. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow;

166. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell;

167. import java.io.FileInputStream;

168. public class ReadXL {

169. /** Excel文件的存放位置。注意是正斜线*/

170. public static String fileToBeRead="D:/JTest/ gongye.xls";

171. public static void main(String argv[]){

172. try{

173. // 创建对Excel工作簿文件的引用

174. HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));

175. // 创建对工作表的引用。

176. // 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")

177. HSSFSheet sheet = workbook.getSheet("Sheet1");

178. // 也可用getSheetAt(int index)按索引引用,

179. // 在Excel文档中,第一张工作表的缺省索引是0,

180. // 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);

181. // 读取左上端单元

182. HSSFRow row = sheet.getRow(0);

183. HSSFCell cell = row.getCell((short)0);

184. // 输出单元内容,cell.getStringCellValue()就是取所在单元的值

185. System.out.println("左上端单元是:" + cell.getStringCellValue());

186. }catch(Exception e) {

187. System.out.println("已运行xlRead() : " + e );

188. }

189. }

190. }

191.

192.

193. 设置单元格格式

194. 在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java 195.

196. 中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式:

197.

198. 1、创建字体,设置其为红色、粗体:

199. HSSFFont font = workbook.createFont();

200. font.setColor(HSSFFont.COLOR_RED);

201. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

202. 2、创建格式

203. HSSFCellStyle cellStyle= workbook.createCellStyle();

204. cellStyle.setFont(font);

205. 3、应用格式

206. HSSFCell cell = row.createCell((short) 0);

207. cell.setCellStyle(cellStyle);

208. cell.setCellType(HSSFCell.CELL_TYPE_STRING);

209. cell.setCellValue("标题");

210.

211. 总之,如本篇文章所演示的一样,Java程序员不必担心Excel工作表中的数据了,利用Jakarta POI API,212.

213. 我们就可以轻易的在程序中存取Excel文档。

214.

215. ==============================================

216.

217. 首先说说现在我所知道的Java编辑Excel文件的两大开源工具:

218.

219. jakarta POI和JavaExcelAPI(简称JXL),这两套工具我都试用了一这段时间,感觉各有优劣吧。POI在某些细节有些小Bug并且不支持写入图片,其他方面都挺不错的;

220.

221. JXL就惨了,除了支持写入图片外,我暂时看不到它比POI好的地方,我碰到的主要的问题就是对公式支持不是很好,很多带有公式的Excel文件用JXL打开后,公式就丢失了(比如now(),today()),在网上看到其他大虾评论说JXL写入公式也有问题,另外,JXL操作Excel文件的效率比POI低一点。经过比较后,我选择了POI开发我的项目。

222.

223. 现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。

224.

225. 1、设置分页符的bug

226.

227. POI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。

228.

229. Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak 时POI会抛出空指针的异常。

230.

231. 解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。

232.

233. 如果sheet是由POI生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel 插入一个分页符来触发POI为rowBreaks创建实例。234.

235. 2、如何拷贝行

236.

237. 我在https://www.360docs.net/doc/4d8340326.html,的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:

238.

239.

240. //注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new

241. public void copyRows

242. (String pSourceSheetName,

243. String pTargetSheetName,

244. int pStartRow, int pEndRow,

245. int pPosition)

246. {

247. HSSFRow sourceRow = null;

248. HSSFRow targetRow = null;

249. HSSFCell sourceCell = null;

250. HSSFCell targetCell = null;

251. HSSFSheet sourceSheet = null;

252. HSSFSheet targetSheet = null;

253. Region region = null;

254. int cType;

255. int i;

256. short j;

257. int targetRowFrom;

258. int targetRowTo;

259.

260. if ((pStartRow == -1) || (pEndRow == -1))

261. {

262. return;

263. }

264. sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);

265. targetSheet = this.fWorkbook.getSheet(pTargetSheetName);

266. //拷贝合并的单元格

267. for (i = 0; i < sourceSheet.getNumMergedRegions(); i++)

268. {

269. region = sourceSheet.getMergedRegionAt(i);

270. if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow)) 271. {

272. targetRowFrom = region.getRowFrom() - pStartRow + pPosition;

273. targetRowTo = region.getRowTo() - pStartRow + pPosition;

274. region.setRowFrom(targetRowFrom);

275. region.setRowTo(targetRowTo);

276. targetSheet.addMergedRegion(region);

277. }

278. }

279. //设置列宽

280. for (i = pStartRow; i <= pEndRow; i++)

281. {

282. sourceRow = sourceSheet.getRow(i);

283. if (sourceRow != null)

284. {

285. for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) 286. {

287. targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));

288. }

289. break;

290. }

291. }

292. //拷贝行并填充数据

293. for (;i <= pEndRow; i++)

294. {

295. sourceRow = sourceSheet.getRow(i);

296. if (sourceRow == null)

297. {

298. continue;

299. }

300. targetRow = targetSheet.createRow(i - pStartRow + pPosition);

301. targetRow.setHeight(sourceRow.getHeight());

302. for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)

303. {

304. sourceCell = sourceRow.getCell(j);

305. if (sourceCell == null)

306. {

307. continue;

308. }

309. targetCell = targetRow.createCell(j);

310. targetCell.setEncoding(sourceCell.getEncoding());

311. targetCell.setCellStyle(sourceCell.getCellStyle());

312. cType = sourceCell.getCellType();

313. targetCell.setCellType(cType);

314. switch (cType)

315. {

316. case HSSFCell.CELL_TYPE_BOOLEAN:

317. targetCell.setCellValue(sourceCell.getBooleanCellValue());

318. break;

319. case HSSFCell.CELL_TYPE_ERROR:

320. targetCell.setCellErrorValue(sourceCell.getErrorCellValue());

321. break;

322. case HSSFCell.CELL_TYPE_FORMULA:

323. //parseFormula这个函数的用途在后面说明

324. targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));

325. break;

326. case HSSFCell.CELL_TYPE_NUMERIC:

327. targetCell.setCellValue(sourceCell.getNumericCellValue());

328. break;

329. case HSSFCell.CELL_TYPE_STRING:

330. targetCell.setCellValue(sourceCell.getStringCellValue());

331. break;

332. }

333. }

334. }

335. }

336.

337. 这个函数有两个问题暂时无法解决:

338.

339. a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?

340.

341. b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!

342.

343. 3、公式的问题

344.

345. POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiVolatile))和today(ATTR

(semiVolatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:

346.

347.

348. private String parseFormula(String pPOIFormula)

349. {

350. final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$

351. StringBuffer result = null;

352. int index;

353.

354. result = new StringBuffer();

355. index = pPOIFormula.indexOf(cstReplaceString);

356. if (index >= 0)

357. {

358. result.append(pPOIFormula.substring(0, index));

359. result.append(pPOIFormula.substring(index + cstReplaceString.length()));

360. }

361. else

362. {

363. result.append(pPOIFormula);

364. }

365.

366. return result.toString();

367. }

368.

369. 至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!

370.

371. 4、向Excel写入图片的问题。

372.

373. 我上POI论坛查相关帖子,得到两种结论:

374.

375. 1、不支持写入图片;

376.

377. 2、支持写入图片,通过EscherGraphics2d这个Class实现。于是我就去查EscherGraphics2d这个Class,发现这个Class提供了N个drawImage方法,喜出望外的我开始写代码,结果调了一天,一直看不到效果,黔驴技穷的我在万般无奈下只好跟踪进drawImage这个函数内部,经过N个函数调用后在最底层函数发现了最终答案:

378.

379.

380. public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,

381. int sx2, int sy2, Color bgColor, ImageObserver imageobserver)

382. {

383. if (logger.check( POILogger.WARN ))

384. logger.log(POILogger.WARN,"drawImage() not supported");

385. return true;

386. }

387.

388. 所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多时候就可以不必重蹈我的覆辙了。既然POI不能写入图片,那我们只能把目光投向JXL,我用JXL写入图片功能是实现了,付出的代价是now()和today()这些函数丢失掉了,鱼与熊掌不能兼得吧。

389.

390. ==========================jsp操作===============================

391.

392. <%@ page contentType="application/msexcel;charset=gb2312" %>

393. response.setHeader("Content-disposition","inline; filename=test1.xls");

394. //以上这行设定传送到前端浏览器时的档名为test1.xls

395. //就是靠这一行,让前端浏览器以为接收到一个excel档

396. 下面正常显示要转化的表

397.

398. --------------------------------------------------------------------------

399.

400. 介绍:

401. Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。

402. 因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI本身

403. 带的一个Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。

404. POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页

405. https://www.360docs.net/doc/4d8340326.html,/poi/hssf/index.html

406. 下面的介绍是基于以下地址的翻译:

407. https://www.360docs.net/doc/4d8340326.html,/poi/hssf/quick-guide.html

408. 目前的版本为1.51应该是很长时间之内的一个稳定版,但HSSF提供的Sample不是基于

409. 1.51所写,所以使用的时候需要适当的注意.

410. 其实POI下面的几个子项目侧重不同读写Word 的HDF正在开发当中.

411. XML下的FOP(https://www.360docs.net/doc/4d8340326.html,/fop/index.html)

412. 可以输出pdf文件,也是比较好的一个工具

413. 目录:

414. 创建一个workbook

415. 创建一个sheet

416. 创建cells

417. 创建日期cells

418. 设定单元格格式

419.

420. 说明:

421. 以下可能需要使用到如下的类

422. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell;

423. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCellStyle;

424. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFDataFormat;

425. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFFont;

426. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow;

427. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet;

428. import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook;

429. import org.apache.poi.hssf.util.HSSFColor;

430.

431. 创建workbook

432.

433. HSSFWorkbook wb = new HSSFWorkbook();

434. //使用默认的构造方法创建workbook

435. FileOutputStream fileOut = new FileOutputStream("workbook.xls");

436. //指定文件名

437. wb.write(fileOut);

438. //输出到文件

439. fileOut.close();

440.

441. 创建一个sheet

442.

443. HSSFWorkbook wb = new HSSFWorkbook();

444. HSSFSheet sheet1 = wb.createSheet("new sheet");

445. //workbook创建sheet

446. HSSFSheet sheet2 = wb.createSheet("second sheet");

447. //workbook创建另外的sheet

448. FileOutputStream fileOut = new FileOutputStream("workbook.xls");

449. wb.write(fileOut);

450. fileOut.close();

451.

452. 创建cells

453. HSSFWorkbook wb = new HSSFWorkbook();

454. HSSFSheet sheet = wb.createSheet("new sheet");

455. //注意以下的代码很多方法的参数是short 而不是int 所以需要做一次类型转换456. HSSFRow row = sheet.createRow((short)0);

457. //sheet 创建一行

458. HSSFCell cell = row.createCell((short)0);

459. //行创建一个单元格

460. cell.setCellValue(1);

461. //设定单元格的值

462. //值的类型参数有多中double ,String ,boolean,

463. row.createCell((short)1).setCellValue(1.2);

464. row.createCell((short)2).setCellValue("This is a string");

465. row.createCell((short)3).setCellValue(true);

466.

467. // Write the output to a file

468. FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 469. wb.write(fileOut);

470. fileOut.close();

471.

472. 创建日期cells

473. HSSFWorkbook wb = new HSSFWorkbook();

474. HSSFSheet sheet = wb.createSheet("new sheet");

475.

476. HSSFRow row = sheet.createRow((short)0);

477.

478. HSSFCell cell = row.createCell((short)0);

479. //设定值为日期

480. cell.setCellValue(new Date());

481.

482. HSSFCellStyle cellStyle = wb.createCellStyle();

483. //指定日期显示格式

484. cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm")); 485. cell = row.createCell((short)1);

486. cell.setCellValue(new Date());

487. //设定单元格日期显示格式

488. cell.setCellStyle(cellStyle);

489.

490. FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 491. wb.write(fileOut);

492. fileOut.close();

493.

494.

495. 设定单元格格式

496. 单元格格式的设定有很多形式包括单元格的对齐方式,内容的字体设置,497. 单元格的背景色等,因为形式比较多,只举一些例子.以下的例子在498. POI1.5中可能会有所改变具体查看API.

499. ..........

500. // Aqua background

501. HSSFCellStyle style = wb.createCellStyle();

502. //创建一个样式

503. style.setFillBackgroundColor(HSSFCellStyle.AQUA);

504. //设定此样式的的背景颜色填充

505. style.setFillPattern(HSSFCellStyle.BIG_SPOTS);

506.

507. //样式的填充类型。

508. //有多种式样如:

509. //HSSFCellStyle.BIG_SPOTS

510. //HSSFCellStyle.FINE_DOTS

511. //HSSFCellStyle.SPARSE_DOTS等

512. style.setAlignment(HSSFCellStyle.ALIGN_CENTER );

513. //居中对齐

514. style.setFillBackgroundColor(HSSFColor.GREEN.index);

515. //设定单元个背景颜色

516. style.setFillForegroundColor(HSSFColor.RED.index);

517. //设置单元格显示颜色

518. HSSFCell cell = row.createCell((short) 1);

519. cell.setCellValue("X");

520. cell.setCellStyle(style);

521.

522. -----------------------------------------------------------------

523. 加上response.setContentType("Application/msexcel");

524. response.setHeader("Content-disposition","attachment; filename=book.xls" );

525. 然后提交给它的时候会时候会提示下载,

526. 下载的就是生成的EXCEL文件。

527.

528. -----------------------------------------------------------

529.

530.

531. 有趣的是,对一个html文件(数据在表格中),当把后缀改为xls后,打开文件即是。532.

533. ------------------------------------------

534.

535. >>加上response.setContentType("Application/msexcel");

536. >> response.setHeader("Content-disposition","attachment; >>filename=book.xls" ); 537. >>然后提交给它的时候会时候会提示下载,

538. >>下载的就是生成的EXCEL文件。

539.

540. book.xls的存放路径应该是哪里?

541.

542. ----------------------------------------------------------------

543.

544.

545. 使用poi的hssf生成一个excel文件以后

546. 有一个主类Workbook(相当于一个excel文件)的方法

547. Workbook.write(OutputStream)可以写到response.getOutputStream()里面

548. 如果事先设置response的contentType为excel和下载的附件名称就可下载excel 549. HSSFWorkbook book = _proxy.expertExcel(_formBean,_login);

550.

551. if(book!=null)

552. {

553. response.setContentType ( "application/ms-excel" ) ;

554. response.setHeader ( "Content-Disposition" ,

555. "attachment;filename="+new String("导出Excel.xls".getBytes(),"iso-8859-1"))

556.

557. ;

558. book.write(response.getOutputStream());

559. }

560. 其中expertExcel无非是从数据库或者其他地方获取数据创建excel即可.

561.

562.

563.

564. ---------------------------------------------------------------

565. response.setHeader("Content-disposition","attachment; filename=book.xls" );

566. 原来加上attachment浏览器就会提示保存或者打开,是我想要的。Thanks all.

567.

568.

569. -------------------------------------------------------------------------

570.

571. 1.用poi生成Excel文件,和WORD文档都可以,是个不错的方法,参见poi网站,楼上的朋友描述的很清楚了,此方法适用于生

572.

573. 成,读取,解析xls文件

574. 2.另外一种更简单的方法:只适用于显示用的EXCEL文件格式,生成常规的html文件格式,后缀命名方式为.xls 即可.

575. 3.espreadsheet适用于网上即时的excel文件交互操作,生成,解析,保存修改,但需要购买

576.

577. -------------------------------------------------------------------------

578.

579. 生成一个rtf文件,然后扩展名写".doc",OK

580.

581. -----------------------------------------------------------

582.

583. 用这个组件向excel写数据时,总是出现中文乱码情况,请问怎样解决?

584.

585. 源代码:

586.

587. HSSFWorkbook wb = new HSSFWorkbook();

588. HSSFSheet sheet = wb.createSheet("new sheet");

589. HSSFHeader header = sheet.getHeader();

590. header.setCenter("Center Header");

591. HSSFRow row = sheet.createRow((short)0);

592. HSSFCell cell = row.createCell((short)0);

593. cell.setCellValue(1);

594. row.createCell((short)1).setCellValue(1.2123654);

595. row.createCell((short)2).setCellValue("This is a string");

596. row.createCell((short)3).setCellValue(true);

597. row = sheet.createRow((short)1);

598. cell = row.createCell((short)0);

599. cell.setCellValue(new Date());

600. row.createCell((short)1).setCellValue(str);

601. row.createCell((short)2).setCellValue("This我是一个好人string");

602. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");

603. wb.write(fileOut);

604. fileOut.close();

605.

606. 当我打开这个"d:/filename.xls"文件时,其中写入的中文全都是乱码!!!

607. 如何解决???

608.

609. ----------------------------------------------------------------------

610.

611. 源代码:

612. HSSFWorkbook wb = new HSSFWorkbook();

613. HSSFSheet sheet = wb.createSheet("new sheet");

614. HSSFHeader header = sheet.getHeader();

615. header.setCenter("Center Header");

616. HSSFRow row = sheet.createRow((short)0);

617. HSSFCell cell = row.createCell((short)0);

618. cell.setCellValue(1);

619. row.createCell((short)1).setCellValue(1.2123654);

620. row.createCell((short)2).setCellValue("This is a string");

621. row.createCell((short)3).setCellValue(true);

622. row = sheet.createRow((short)1);

623. cell = row.createCell((short)0);

624. cell.setCellValue(new Date());

625. String str = new String("我是一个好人!!!");

626. row.createCell((short)1).setCellValue(str);

627. row.createCell((short)2).setCellValue("This我是一个好人string");

628.

629. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");

630. wb.write(fileOut);

631. fileOut.close();

632. 当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!

633. 请问如何解决?

634.

635. ---------------------------------------------------------------------

636.

637. <%@ page contentType="application/msexcel;charset=gb2312" %>

638. response.setHeader("Content-disposition","inline; filename=***.xls");就可以了,要是想要word 就

639. <%@ page contentType="application/msword;charset=gb2312" %>

640. response.setHeader("Content-disposition","inline; filename=test1.xls");

641.

642.

643. -------------------------------------------------------------------

644.

645. 引用pengruihua 说:

646.

647. 有趣的是,对一个html文件(数据在表格中),当把后缀改为xls后,打开文件即是。

648.

649. 这个只能说明excel强,这样写得xls,在JXL或者POI中都是不认的。

650.

651. 加一句,用POI写Excel有点问题,当反复读写一个excel文件的时候,读的速度会越来越慢。

652. 我的一个生成excel的就是,到了几千条记录的时候慢得就不能接受了,最后只好先生成csv的文本,再将文本导成xls

653.

654. 文件

655.

656.

657. ---------------------------------------------------------------------------

658. 引用java_century 说:

659.

660. 源代码:

661. HSSFWorkbook wb = new HSSFWorkbook();

662. HSSFSheet sheet = wb.createSheet("new sheet");

663. HSSFHeader header = sheet.getHeader();

664. header.setCenter("Center Header");

665. HSSFRow row = sheet.createRow((short)0);

666. HSSFCell cell = row.createCell((short)0);

667. cell.setCellValue(1);

668. row.createCell((short)1).setCellValue(1.2123654);

669. row.createCell((short)2).setCellValue("This is a string");

670. row.createCell((short)3).setCellValue(true);

671. row = sheet.createRow((short)1);

672. cell = row.createCell((short)0);

673. cell.setCellValue(new Date());

674. String str = new String("我是一个好人!!!");

675. row.createCell((short)1).setCellValue(str);

676. row.createCell((short)2).setCellValue("This我是一个好人string");

677.

678. FileOutputStream fileOut = new FileOutputStream("d:/filename.xls");

679. wb.write(fileOut);

680. fileOut.close();

681. 当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!

682. 请问如何解决?

683.

684.

685. 使用POI这样处理中文

686. HSSFCell cell = row.createCell((short)1);

687. cell.setEncoding(HSSFCell.ENCODING_UTF_16); 688. cell.setCellValue("中文");

POI操作excel内存一直增大解决方法

POI操作Excel POI操作Excel 内存一直增大直至溢出问题主要是针对写入内容操作.xlsx格式 遇到问题: 如果反复操作模板文件往工作表中写入数据会出现文件内存一直增大问题 多次操作的话直至内存溢出。 (1)首先要配置myEclipse ------->run----->run Configurations----->Java Application ----对其下要用到的类进行配置---->Arguments在VM arguments 下写入 -Xms512m -Xmx1048m -XX:PermSize=128m -XX:MaxPermSize=400m -Dcom.sun.management.jmxremote=true 点击apply 然后确定 (2)这里根据能想到的方法进行了多次测试: <1>多次下载数据写入sheet1 每次写入数据之前清空sheet1中的所有行内容,之后再写入新数据即每次操作都是对sheet1的更新;能够清空内容但是内存大小还会一直增大初步认为是内容清空了行所占的占位符还在那表面是空了但是真实的大小还是存在,暂没有解决此问题 示例代码 /*for(int i = 0;;i++){ XSSFRow row = sheet.getRow(i); if(row != null){ sheet.removeRow(row); }else{ break; } }*/ <2>多次下载数据写入sheet1 每次写入前对工作区的工作表进行删除操作,删除sheet1 ,然后在新建sheet1,写入数据,确保每次数据都是最新暂没有解决此问题 示例代码 public void deleteSheet(String targetFile,String sheetName) { try { FileInputStream fis = new FileInputStream(targetFile); HSSFWorkbook wb = new HSSFWorkbook(fis); //删除Sheet wb.removeSheetAt(wb.getSheetIndex(sheetName)); this.fileWrite(targetFile, wb); fis.close(); } catch (Exception e) { e.printStackTrace(); } } //新建 public static void newSheet1(String filePath,String sheetName) throws Exception{ try { System.out.println("然后走的这里新建sheet1+++++++++++++++++++++++++++++"); FileInputStream fis = new FileInputStream(filePath); XSSFWorkbook workbook2003 = new XSSFWorkbook(fis);

poi读写Excel文件

一、Excel基础 二、HSSF概况 三、通过usermodel读取文件 四、通过usermodel写入文件 五、通过eventusermodel读取文件 六、HSSF电子表格结构 七、通过HPSF读取文档属性 八、文档摘要信息 九、附录 ━━━━━━ 正文: ━━━━━━ 在上一篇文章中,我们介绍了POI项目的基本概念,了解了如何用POI来读写OLE 2复合文档结构,并给出了两个简单的例子:用POI来读写Excel文件的Workbook流。本文继续前文的话题,阐述如何用POI来读取/写入完整的Excel文件。 约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。为了保证本文的及时性,本文将按照最近的1.9开发版说明。虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。 一、Excel基础 Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。 二、HSSF概况 POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也

java的POI操作Excel文件

java的POI操作Excel文件(2) 现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。 1、设置分页符的bug POI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。 Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。 解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。 如果sheet是由POI生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。 2、如何拷贝行 我在https://www.360docs.net/doc/4d8340326.html,的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写: //注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new public void copyRows (String pSourceSheetName, String pTargetSheetName, int pStartRow, int pEndRow, int pPosition) { HSSFRow sourceRow = null; HSSFRow targetRow = null; HSSFCell sourceCell = null; HSSFCell targetCell = null; HSSFSheet sourceSheet = null; HSSFSheet targetSheet = null; Region region = null; int cType; int i; short j; int targetRowFrom; int targetRowTo;

POI操作Excel常用方法总结

POI操作Excel常用方法总结 一、POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97-2003对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。 二、HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。 三、POI EXCEL文档结构类 HSSFWorkbook excel文档对象 HSSFSheet excel的sheet HSSFRow excel的行 HSSFCell excel的单元格 HSSFFont excel字体 HSSFName 名称 HSSFDataFormat 日期格式 HSSFHeader sheet头 HSSFFooter sheet尾 HSSFCellStyle cell样式 HSSFDateUtil 日期 HSSFPrintSetup 打印 HSSFErrorConstants 错误信息表 四、EXCEL常用操作方法 1、得到Excel常用对象 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:\test.xls")); HSSFWorkbook wb = new HSSFWorkbook(fs);//得到Excel工作簿对象 HSSFSheet sheet = wb.getSheetAt(0); //得到Excel工作表对象 HSSFRow row = sheet.getRow(i);//得到Excel工作表的行 HSSFCell cell = row.getCell((short) j);//得到Excel工作表指定行的单元格 cellStyle = cell.getCellStyle();//得到单元格样式 2、建立Excel常用对象 HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象 HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象 HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行 cellStyle = wb.createCellStyle();//创建单元格样式

java读取和写入EXCEL文件

java读取和写入Excel文件 在Java中读取Excel文件的内容 在这里,我使用的是一个叫Java Excel API的东西,类似的还有jakarta的POI,不过感觉那个太复杂了点儿。而且jxl对中文的支持相当的好,至少我在用的过程中一点问题没出。 一、下载地址 [url]https://www.360docs.net/doc/4d8340326.html,/jexcelapi/[/url] 二、特性 可以读取Excel 95, 97, 2000文件 可以读或写Excel 97及其以后版本的的公式(不过我发现好像有bug) 生成Excel 97格式的电子表格 支持字体、数字和日期格式化 支持单元格的颜色和阴影 可以编辑现有的文件 三、读文件 //声明一下,记得后面要关闭哦。。 Workbook workbook = null; try { workbook = Workbook.getWorkbook(new File("d:\\temp\\TestRead.xls")); } catch (Exception e) { throw new Exception("file to import not found!"); } Sheet sheet = workbook.getSheet(0); Cell cell = null; int columnCount=3; int rowCount=sheet.getRows(); for (int i = 0; i

poi操作excel行自适应高度

import java.text.SimpleDateFormat; import java.util.Date; import https://www.360docs.net/doc/4d8340326.html,ng3.StringUtils; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFDataFormat; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFDateUtil; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook; import https://www.360docs.net/doc/4d8340326.html,ermodel.Cell; import org.apache.poi.ss.util.CellRangeAddress; /** * excel行自适应高度 * @author lw * @version 2019年8月27日下午1:59:27 */ public class AutoRowHeightUtil { /** * 自适应excel行高 * @author lw * @date 2019年8月27日上午10:27:33 * @param cell 列 * @param margin 字体边距 */ public static void autoRowHeight(HSSFCell cell, short margin) { if(cell == null) { return ; } String cellVal = getStringCellValue(cell) ; if(StringUtils.isBlank(cellVal)) { return ;

Java用poi读取excel文件

Java用poi读取excel文件 POI 是Apache的一个开源的工具包,可以在Apache的官网下载到jar包。如下为简单示例: package POI; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class ReadExcel { public static void main(String[] args) { try { InputStream input = new FileInputStream("D:\\test.xls"); POIFSFileSystem fs = new POIFSFileSystem(input); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); // Iterate over each row in the sheet Iterator rows = sheet.rowIterator();

poi读取excel并输出到jsp页面

代码来源于网络,只做了部分修改,我也是刚用到很多都不懂,找了一些例子之类的自己用,有些不错的分享给大家,仅供参考。 下面这个是用servlet做(注意web.xml );其实原理一样;源码如下 readExcelServlet.java package com.test.servlet; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFDateUtil; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * author:wx * describe:Reads the Excel example * */ public class readExcelServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; /** * * Constructor of the object. */ public readExcelServlet() { super(); } /** * Destruction of the servlet.
* */ public void destroy() { super.destroy(); }// Just puts "destroy" string in log // Put your code here /** * doGet */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

POI设置EXCEL单元格格式的操作小结

POI中可能会用到一些需要设置EXCEL单元格格式的操作小结: 先获取工作薄对象: Java代码 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); HSSFCellStyle setBorder = wb.createCellStyle(); HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); HSSFCellStyle setBorder = wb.createCellStyle(); 一、设置背景色: Java代码 setBorder.setFillForegroundColor((short) 13);// 设置背景色setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); setBorder.setFillForegroundColor((short) 13);// 设置背景色setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 二、设置边框: Java代码 setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 三、设置居中: Java代码 setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中

poi读写excel案例

Java-Excel 报表开发 POI (2009-02-19 21:44:10) 转载▼ 分类:java 标签: java 杂谈 开发环境为windowsXP-SP2,Eclipse3.2,JDK1.5.07,其实差不多都行,不会有太大的差异。本文从POI 下载开始讲解,前提是开发环境包括系统变量等等已经正确设置完毕。 1.POI的下载 截至本文发表,POI最新版本是3.0.1,距离上一个Final版本有3年了吧,以至于我差点儿就把他放弃了——以为没人管了。官方的公告讲,这一版主要是追加了一些新的特性和BUG修正,不过稍微有点儿遗憾的是,还不能很好的操作Excel2007。 POI官方网址: https://www.360docs.net/doc/4d8340326.html,/ JAR包下载: https://www.360docs.net/doc/4d8340326.html,/poi/release/bin/poi-bin-3.0.1-FINAL-20070705.zip 源码下载: https://www.360docs.net/doc/4d8340326.html,/poi/release/src/poi-src-3.0.1-FINAL-20070705.zip 下载上面的JAR和源码(源码不是必须的,但是为了早日修得正果,深入系统的看看POI代码还是有必要的)并解压待用。 2.用Eclipse搭建项目 打开Eclipse 依次点击File->New->Java Project 输入项目名称,本例中设置为POI 单击完成 在项目上点击右键->New->Folder 输入文件夹名称lib 把刚才解压的poi-3.0.1-FINAL-20070705.jar复制过来 右键点击项目,选择Properties 在左侧列表里选中Java Build Path,右侧选中Libraries 点击Add JARs,选择POI项目的lib下的所有文件 两次OK确认,回到Eclipse界面 小技巧,快捷操作:可以用鼠标左键选中poi-3.0.1-FINAL-20070705.jar但不松开,拖到任务栏的Eclipse 图标上等候1秒左右,Eclipse会自动弹起来,依然不松开移动到lib文件夹上,这个时候鼠标后面跟个十

在Java中读写Excel文件

在Java中读写Excel文件 Jakarta的POI项目提供了一组操纵Windows文档的Java API,如下几个类提供了操作Excel文件的方便的途径:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,分别代表了Excel电子表格中的Book、Sheet、行和单元格。 你可以在下面地址下载到最新的POI工具包: https://www.360docs.net/doc/4d8340326.html,/poi/index.html 下面的代码创建一个Excel文件test.xls,并在第一行的第一格中写入一条消息: 1.import https://www.360docs.net/doc/4d8340326.html,ermodel.*; 2.import java.io.FileOutputStream; 3. 4.// code run against the jakarta-poi-1. 5.0-FINAL-2002050 6.jar. 5.public class PoiTest { 6. 7.static public void main(String[] args) throws Exception { 8.FileOutputStream fos = new FileOutputStream("d:\test.xls"); 9. HSSFWorkbook wb = new HSSFWorkbook(); 10. HSSFSheet s = wb.createSheet(); 11. wb.setSheetName(0, "first sheet"); 12. HSSFRow row = s.createRow(0); 13.HSSFCell cell = row.createCell(0); 14.cell.setCellValue("Hello! This message is generated from POI."); 15. wb.write(fos); 16. fos.close(); 17. } 18. 19.} 读取Excel文件时,首先生存一个POIFSFileSystem对象,由POIFSFileSystem 对象构造一个HSSFWorkbook,该HSSFWorkbook对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串: 1. POIFSFileSystem fs = null; 2. HSSFWorkbook wb = null; 3.

Java读取Excel文件的几种方法

Java读取Excel文件的几种方法 最近单位有个项目需要读取excel文件的内容,特别对java读取excel文件的方法做了一点学习,也为了其他人以后能更简单地开发,少走弯路,特写此文,以下程序经过了我的测试,可以保证程序可用,如果你照搬都不行,可能是你的环境有问题。 读取excel文件的常用开源免费方法有以下几种: JDBC-ODBC Excel Driver jxl.jar jcom.jar poi.jar 下面分别对这几种方法分别进行探讨 1、JDBC-ODBC Excel Driver 这种方法是将excel看成是数据库进行操作,使用SQL Select语句即可 查询excel表格。优点是:不需要第三方的jar包。 如下表样 首先在控制面板进行数据源ODBC登记 具体方法如下:

下面就是代码了。 package xuzhe;

import java.io.*; import java.sql.*; //java xuzhe.ExcelJDBC public class ExcelJDBC { public static void main(String[] args) throws SQLException{ Connection con = null; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection( "jdbc:odbc:ExcelJDBC" ); Statement st = con.createStatement(); ResultSet rs = st.executeQuery( "Select * from [Sheet1$]" ); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); System.out.println ("表格列数"+numberOfColumns ); System.out.println( rsmd.getColumnName(1)+ "," + rsmd.getColumnName(2) + "," + rsmd.getColumnName(3)); while (rs.next()) { for (int i = 1; i <= numberOfColumns; i++) { if (i > 1) System.out.print(", "); String columnValue = rs.getString(i); System.out.print(columnValue); } System.out.println(""); } rs.close(); st.close(); } catch(Exception ex) { System.err.print("Exception: "); System.err.println(ex.getMessage()); } finally { con.close(); } } } 执行结果如下:

Java读写Excel之POI入门

Java读写Excel之POI入门 Apache POI 是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。 如果处理.xlsx、docx、pptx的话可以试试Docx4j 。 ?HSSF -提供读写Microsoft Excel XLS格式档案的功能。 ?XSSF -提供读写Microsoft Excel OOXML XLSX格式档案的功能。 ?HWPF -提供读写Microsoft Word DOC格式档案的功能。 ?HSLF -提供读写Microsoft PowerPoint格式档案的功能。 ?HDGF -提供读Microsoft Visio格式档案的功能。 ?HPBF -提供读Microsoft Publisher格式档案的功能。 ?HSMF -提供读Microsoft Outlook格式档案的功能。 版本:poi-3.8-20120326.jar 1、生成Workbook Java代码

2、生成Workbook OOXML形式(.xlsx) Java代码 3、打开Workbook Java代码

使用POI读取excel文件内容

使用POI读取excel文件内容 package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell;import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFDateUtil;import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow;import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet;import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/** * 操作Excel表格的功能类*/public class ExcelReader { private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; /** * 读取Excel表格表头的内容* @param InputStream * @return String 表头内容的数组*/ public String[] readExcelTitle(InputStream is) { try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e)

poi读取excel,包含所有excel版本,兼容excel2003和2007以上版本

package com.excel; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook; import https://www.360docs.net/doc/4d8340326.html,ermodel.Cell; import https://www.360docs.net/doc/4d8340326.html,ermodel.DateUtil; import https://www.360docs.net/doc/4d8340326.html,ermodel.Row; import https://www.360docs.net/doc/4d8340326.html,ermodel.Sheet; import https://www.360docs.net/doc/4d8340326.html,ermodel.Workbook; import https://www.360docs.net/doc/4d8340326.html,ermodel.WorkbookFactory; import https://www.360docs.net/doc/4d8340326.html,ermodel.XSSFWorkbook; import org.apache.xmlbeans.impl.piccolo.io.FileFormatException; /** * 读取EXCEL内容 * @author lxr * */ public class TestReadExcelAll { private static final String EXTENSION_XLS = "xls"; private static final String EXTENSION_XLSX = "xlsx"; /** * 判断EXCEL版本 * @param in * @param filename * @return * @throws IOException */ public static Workbook getWorkbook(InputStream in,String filename)throws IOException {

POI操作excel大全

POI操作excel大全 第一讲:基本的Excel读写本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。按照惯例,拿HelloWorld说事儿。 说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应 2.5.1的。 核心代码如下,注释部分为讲解。 这里只挑干的讲,完整的代码请参考(下载代码)。 //创建一个空白的WorkBook HSSFWorkbook wb = new HSSFWorkbook(); //基于上面的WorkBook创建属于此WorkBook 的Sheet, // 3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。H SSFSheet st = wb.createSheet(“测试页“); //创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个, //注意,尽管参数是Int类型,但是Excel最多支持65536行 HSSFRow row = st.createRow(0); //创建属于上面Row的Cell,参数0可以是0~255之间的任何一个, //同样,是因为Excel最大支持的列数为256列 HSSFCell cell = row.createCell((short)

0); //设置此单元格的格式为文本,此句可以省略,Excel会自动识别。 //其他还有几种常用的格式,请参考本文底部的补充部分。c ell.setCellType(HSSFCell.CELL_TYPE_STRING); //此处是 3.0.1版的改进之处,上一版可以直接 setCellValue(“Hello, World!“), //但是在 3.0.1里,被deprecated了。c ell.setCellValue(new HSSFRichTextString(“Hello, World!“)); //创建一个文件输出流,指定到C盘根目录下(C盘都有吧?) //xls是Excel97-2003的标准扩展名,xx是xlsx,目前的POI能直接生产的还是xls格式, //如果此处把扩展名改成xlsx,在用Excelxx打开此文件时会报错。F ileOutputStream writeFile = new FileOutputStream(“c:/helloworld.xls“); //把WorkBook写到流里 wb.write(writeFile); //记得手动关闭流,官方文档已经做了特别说明,说POI不负责关闭用户打开的流。所以. writeFile.close(); 上面就是创建一个新文档的简易代码,下面的例子是读取刚才创建的Excel并把读取到的内容显示在控制台上。 //指定要读取的文件,本例使用上面生成的helloworld.xls FileInputStream readFile = new FileInputStream(“c:/helloworld.xls“); //创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流

POI解析excel2007和生成excel2007

最近几天在整理客户的数据,数据量比较大,有几十万条,用到了excel。用户提供的数据有很多重复的,这个我们要挑拣出来,我用代码写挑拣重复的数据,原来用jxl解析excel,发现excel不支持office2007,并且excel2003最大的行数只能是65535,这样就不能运行一次代码解决问题了。查了下资料,apache 的POI可以解析office2007。下面两个简单例子望能提供给网友参考。 1.读取excel2007 Java代码 1. //office2007工作区 2. XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream( "D:/temp/test_poi.xlsx")); 3. //获得该工作区的第一个sheet 4. XSSFSheet sheet = wb.getSheetAt(0); 5. //总共有多少行,从0开始 6. int totalRows = sheet.getLastRowNum(); 7. for (int i = 0; i <= totalRows; i++) { 8. //取得该行 9. XSSFRow row = sheet.getRow(i); 10. //注释的代码,是为了防止excel文件有空行 11.// if(row == null) { 12.// continue; 13.// } 14. System.out.println(row.getCell(1).toString()); 15. } 2.生成excel2007 Java代码 1.//输出流 2.OutputStream os = new FileOutputStream("D:/temp/create.xlsx"); 3.//工作区 4.XSSFWorkbook wb = new XSSFWorkbook(); 5.//创建第一个sheet 6.XSSFSheet sheet= wb.createSheet("test"); 7.//生成第一行 8.XSSFRow row = sheet.createRow(0); 9.//给这一行的第一列赋值 10.row.createCell(0).setCellValue("column1"); 11.//给这一行的第一列赋值 12.row.createCell(1).setCellValue("column2");

poi操作Excel中sheet的复制(java版)

package https://www.360docs.net/doc/4d8340326.html,bos.utils.exportexcel; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCell; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFCellStyle; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFFont; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRichTextString; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFRow; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFSheet; import https://www.360docs.net/doc/4d8340326.html,ermodel.HSSFWorkbook; import org.apache.poi.hssf.util.Region; import https://www.360docs.net/doc/4d8340326.html,ermodel.Font; public class CopyExcelSheet{ @SuppressWarnings("deprecation") public static void main(String[] args) throws FileNotFoundException, IOException { String fromPath = "C:\\Users\\Administrator\\Desktop\\quinn\\1.xls";// excel存放路径 String toPath = "C:\\Users\\Administrator\\Desktop\\quinn\\5.xls";// 保存新EXCEL路径 copyExcelSheet(fromPath, toPath); } /** * @Title: 根据文件路径复制sheet * @Description: 将fromPath文件中的sheet全部复制到toPath中 * @param @param fromPath 源文件全路径 * @param @param toPath 新文件全路径 * @param @throws IOException * @return 返回类型 * @throws */ @SuppressWarnings("deprecation") public static void copyExcelSheet(String fromPath, String toPath) throws IOException { // 创建新的excel File toFile = new File(toPath); HSSFWorkbook wbCreat = null;

相关文档
最新文档