使用poi读写Excel
2024-09-10 22:18:18
对于一个程序员来说,文件操作是经常遇到的,尤其是对Excel文件的操作。
在这里介绍一下我在项目中用到的一个操作Excel的工具——POI。关于POI的一些概念,网络上很多,详细信息大家可以自行百度,我在这里只做简单介绍。POI是apache的类库,主要是为Java开发人员提供对Office文件(word、ppt、Excel)处理的支持。我这里主要给出几个例子来说明演示一下。
准备工作
我用的版本是3.10.1,需要的jar有:
- dom4j.jar
- log4j-1.2.13.jar
- poi-3.10.1-20140818.jar
- poi-ooxml-3.10.1-20140818.jar
- poi-ooxml-schemas-3.10.1-20140818.jar
- poi-scratchpad-3.10.1-20140818.jar
代码示例1.读取Excel
- public void testReadExcel() {
- try {
- // 读取Excel
- Workbook wb = new HSSFWorkbook(new FileInputStream("d:\\2.xls"));
- // 获取sheet数目
- for (int t = 0; t < wb.getNumberOfSheets(); t++) {
- Sheet sheet = wb.getSheetAt(t);
- Row row = null;
- int lastRowNum = sheet.getLastRowNum();
- // 循环读取
- for (int i = 0; i <= lastRowNum; i++) {
- row = sheet.getRow(i);
- if (row != null) {
- // 获取每一列的值
- for (int j = 0; j < row.getLastCellNum(); j++) {
- Cell cell = row.getCell(j);
- String value = getCellValue(cell) ;
- if(!value.equals("")){
- System.out.print(value + " | ");
- }
- }
- System.out.println();
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
用到了一个方法:
- /***
- * 读取单元格的值
- *
- * @Title: getCellValue
- * @Date : 2014-9-11 上午10:52:07
- * @param cell
- * @return
- */
- private String getCellValue(Cell cell) {
- Object result = "";
- if (cell != null) {
- switch (cell.getCellType()) {
- case Cell.CELL_TYPE_STRING:
- result = cell.getStringCellValue();
- break;
- case Cell.CELL_TYPE_NUMERIC:
- result = cell.getNumericCellValue();
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- result = cell.getBooleanCellValue();
- break;
- case Cell.CELL_TYPE_FORMULA:
- result = cell.getCellFormula();
- break;
- case Cell.CELL_TYPE_ERROR:
- result = cell.getErrorCellValue();
- break;
- case Cell.CELL_TYPE_BLANK:
- break;
- default:
- break;
- }
- }
- return result.toString();
- }
解释一下,首先将文件读入到工作簿Workbook中,Workbook是一个接口,他有2个实现:HSSFWorkbook和XSSFWorkbook。前者是用来读取97-03版的Excel,扩展名为xls,后者是读取07及以后的版本,扩展名为xlsx。读入到workbook中,然后循环所有的sheet,在sheet循环所有的有效行和有效列。其中sheet.getLastRowNum()获得最后一行的索引值(从0开始),而sheet.getPhysicalNumberOfRows()则是获取的最后一行的行号(从1开始)。这里要注意的是循环列不是在sheet中循环,而是在row中循环。
效果图如下:
代码示例2. 写入Excel文件
- public void testWriteExcel() {
- String excelPath = "d:/3.xls";
- Workbook workbook = null;
- try {
- // XSSFWorkbook used for .xslx (>= 2007), HSSWorkbook for 03 .xsl
- workbook = new HSSFWorkbook();// XSSFWorkbook();//WorkbookFactory.create(inputStream);
- } catch (Exception e) {
- System.out.println("创建Excel失败: ");
- e.printStackTrace();
- }
- if (workbook != null) {
- Sheet sheet = workbook.createSheet("测试数据");
- Row row0 = sheet.createRow(0);
- for (int i = 0; i < 6; i++) {
- Cell cell = row0.createCell(i, Cell.CELL_TYPE_STRING);
- cell.setCellValue("列标题" + i );
- //sheet.autoSizeColumn(i);//自动调整宽度
- }
- for (int rowNum = 1; rowNum < 10; rowNum++) {
- Row row = sheet.createRow(rowNum);
- for (int i = 0; i < 6; i++) {
- Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING);
- cell.setCellValue("单元格" + String.valueOf(rowNum + 1)
- + String.valueOf(i + 1));
- }
- }
- try {
- FileOutputStream outputStream = new FileOutputStream(excelPath);
- workbook.write(outputStream);
- outputStream.flush();
- outputStream.close();
- } catch (Exception e) {
- System.out .println("写入Excel失败: ");
- e.printStackTrace();
- }
- }
- }
效果图如下:
怎么样,很简单吧。只要你使用了poi,不管你有没有安装Office,都可以完美的操作Office文件,小伙伴们,都快来试试看吧。
最新文章
- iOS开发——UI基础-提示框
- Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
- C/C++中文的编码和字符串处理
- Facebook 调试工具Stetho配置入门
- mysql 表级锁
- Jquery知识小点备注
- 20170723-Ioc与AOP
- 上下文管理协议with open as
- ubuntu 14.04 postgresql 的总结
- 用Synoptic Panel自定义基于图形的可视化控件--制作一张剧场售票统计报表
- sparkR could not find function ";textFile";
- 微信小程序button选中改样式-实现单选/多选
- java.lang.NoClassDefFoundError: Lcom/opensymphony/xwork2/util/logging/Logger tomcat6 启动错误
- QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换
- pandas_datareader.data 和 fix_yahoo_finance 获取金融数据
- spring学习(一)——控制反转简单例子
- bzoj 1449 费用流
- tomcat和应用集成
- spring实现定时任务
- 使用fastboot刷机流程【转】
热门文章
- ACM题目————The partial sum problem
- 【转】java_web开发入门
- json返回日期格式化的解决
- Human Gene Functions
- 如何使用不同参数组合生成独立的TestCase函数(Python)
- C#和SQl 注入字符串的攻击 和 防止注入字符转的攻击
- PHP计划任务之关闭浏览器后仍然继续执行的函数
- Java动态代理 cglib
- 【leetcode❤python】198. House Robber
- jquery之each()、$.each()[jQuery.each()]