Java操作excel-兼容office 2007版本之后
来源:互联网 发布:淘宝手机充值多久到账 编辑:程序博客网 时间:2024/06/06 02:53
前言
office2007版本有一次标准升级,最为明显的就是excel文件的文件名后缀(文件扩展名)由xls变成了xlsx,这是需要注意的地方,因为按照xls格式来处理xlsx格式的文件是无法操作的,
反过来,使用操作xlsx格式的文件的方式操作文件扩展名(文件位缀)为xls是没有问题的。
因为本质上来说,office之后的版本对之前的版本是兼容的,这个在Office 开发组件poi中也得到了提现。即向下兼容,或者向后兼容的,只旧系统的东西依旧可以在新系统被正常使用。
需要注意的是,本文有使用log4j2,如果你的环境没有配置日志,可以把日志代码去除,换为System.out,println();
如果你对log4j2感兴趣,可以参考APACHE LOG4J™ 2 学习笔记-log4j2 环境部署到各种类型输出+maven\mysql\滚动文件\控制台\异步\过滤器
maven 依赖
<!-- 操作office办公文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.6.0</version></dependency>
poi是专门操作office文件的免费的API:http://poi.apache.org/
废话不多说了,直接贴代码:
·读取excel文件 readOfficeExcelFile
·在原先的excel文件续写-没有加末尾判断,可能会造成数据被覆盖 writeOfficeExcelFile
·程序新建一个excle文件,并且填充一些数据 createOfficeExcelFile
枚举类提供常量-本例中仅部分有用到
package com.bestcxx.mavenstu.mavenssh.util;/** * @theme 枚举类-设置静态变量 * @author wujie */public enum EnumUtil {//可以以逗号间隔 FILE_OFFICE_EXCEL_NAME("officeExcelDemo.xlsx"),FILE_OFFICE_EXCEL_PATH("src/main/webapp/WEB-INF/file"),//office 的 excel文件COMMON_DATABASE_PROPERTIES("config/jdbc.properties"),COMMON_ENCODING("utf-8"),FILE_TXT_PATH("src/main/webapp/WEB-INF/file/filetxt.txt"),//src/main/resources/file/filetxt.txt 也是可以的,都是相对路径WECHAT_APPID("appid"), //微信公众号平台账户的appidWECHAT_APPSECRET("appsecret"), //微信公众号平台账户的appsecretPROXY_SERVICEPORT_SHEZHI("0"), //代理设置-是否启用代理,0-NO,1-YESPROXY_PROXYHOST("192.168.1.1"), //代理设置-代理IPPROXY_PROXYPORT("8080"); //代理设置-代理端口 private String temStr; private EnumUtil(String temStr){ this.temStr=temStr; } @Override public String toString() { return String.valueOf (this.temStr); } }
工具类
package com.bestcxx.mavenstu.mavenssh.file;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.apache.poi.EncryptedDocumentException;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.ss.usermodel.WorkbookFactory;import org.apache.poi.xssf.usermodel.XSSFWorkbook;/** * * @theme 操作 excel 文件的工具类 * @author wujie * @Datetime 2017年3月24日 下午2:52:10 * HSSF - 提供读写Microsoft Excel格式档案的功能。 * XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。 * HWPF - 提供读写Microsoft Word格式档案的功能。 * HSLF - 提供读写Microsoft PowerPoint格式档案的功能。 * HDGF - 提供读写Microsoft Visio格式档案的功能。 */public class FileOfficeExcel {private static Logger logger=LogManager.getLogger(FileOfficeExcel.class);/** * * @instruction 读取excel文件 * @Datetime 2017年3月27日 下午3:59:15 * @param excelPath 文件夹路径 * @param excelName 文件名字 officeExcelDemo.xlsx */public void readOfficeExcelFile(String excelPath,String excelName) {try {File file = new File(excelPath, excelName);// 文件转化为输入流FileInputStream fi;fi = new FileInputStream(file);// 操作excel文件需要创建Workbook 对象Workbook wb;wb = WorkbookFactory.create(fi);// 获得具体的一个sheet页-这里是第一个 Sheet sheet = wb.getSheetAt(0);// 获取最后一行的行号int rowNum = sheet.getLastRowNum() + 1;//这里加1,是因为获取的是序数值,而函数是从0开始计数的//logger.info("\n获取第一个 sheet 包含行数为:"+rowNum);// 获取某一行的数据-这里是第i行for(int i=2;i<rowNum;i++){Row row = sheet.getRow(i);// 获取某一行的列数int cellNum = row.getLastCellNum();logger.info("\n 第"+i+"行 包含列数为:"+cellNum);//输出这一句就可以看到,A1,B1, A2,B2,C2,D2,E2//logger.info("\n行信息:"+row.toString());//遍历行 for(int j=0;j<cellNum;j++){Cell cell=row.getCell(j);cell.setCellType(Cell.CELL_TYPE_STRING);//将表格数据格式转化为字符类型logger.info(cell.getStringCellValue()+" ");}}} catch (FileNotFoundException e1) {logger.info(e1.toString());} catch (EncryptedDocumentException e) {logger.info(e.toString());} catch (InvalidFormatException e) {logger.info(e.toString());} catch (IOException e) {logger.info(e.toString());}}/** * * @instruction 在原先的excel文件续写-没有加末尾判断,可能会造成数据被覆盖 * @Datetime 2017年3月27日 下午6:25:26 * @param excelPath * @param excelName */public void writeOfficeExcelFile(String excelPath, String excelName) {Workbook wb;File file=new File(excelPath,excelName);String fileName=excelPath+"/"+excelName;try {wb = WorkbookFactory.create(file);Sheet sheet = wb.getSheetAt(0);Row row=sheet.createRow(1);for (int i = 0; i < 10; i++) {Cell cell = row.createCell(i);cell.setCellValue(i + "");}ByteArrayOutputStream os = new ByteArrayOutputStream();OutputStream out = null;try {wb.write(os);byte[] xls = os.toByteArray();out = new FileOutputStream(file);out.write(xls);} catch (IOException e) {logger.info(e.toString());} finally {try {if(wb!=null){wb.close();}if(out!=null){out.close();}if(os!=null){os.close();}logger.info("覆盖重写文件 "+fileName);} catch (IOException e) {logger.info(e.toString());}}} catch (EncryptedDocumentException e) {logger.info(e.toString());} catch (InvalidFormatException e) {logger.info(e.toString());} catch (IOException e) {logger.info(e.toString());} }/** * * @instruction 程序新建一个excle文件,并且填充一些数据 * @Datetime 2017年3月27日 下午6:00:08 * @param excelPath * @param excelName */public void createOfficeExcelFile(String excelPath, String excelName) {//如果文件存在,就先删除String fileName=excelPath+"/"+excelName;File file = new File(excelPath,excelName); if(file.exists()){ //文件存在 logger.info("文件已经存在,删除 "+fileName); file.delete(); }// 操作excel文件需要实例化 Workbook,借助poi,(office 2007 及之后版本XSSF,向后(下)兼容,xlsx 结尾) //HSSF - 提供读写Microsoft Excel格式档案的功能,xls。 //XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。 //Workbook wb = new XSSFWorkbook(); Workbook wb = new XSSFWorkbook();// 设置字体格式-略 import org.apache.poi.ss.usermodel.Font;// Font font = wb.createFont();// 设置单元格样式-略 import org.apache.poi.ss.usermodel.CellStyle;// CellStyle style = wb.createCellStyle();// 新建工作表Sheet sheet = wb.createSheet("测试sheet1");// 创建工作表,名称为test// 新建行-第0行,从0开始计数Row row = sheet.createRow(0);// 给第0行添加数据for (int i = 0; i < 10; i++) {Cell cell = row.createCell(i);cell.setCellValue(i + "");// 结合样式// cell.setCellStyle(style);}ByteArrayOutputStream os = new ByteArrayOutputStream();OutputStream out = null;try {wb.write(os);byte[] xls = os.toByteArray();out = new FileOutputStream(file);out.write(xls);} catch (IOException e) {logger.info(e.toString());} finally {try {if(wb!=null){wb.close();}if(out!=null){out.close();}if(os!=null){os.close();}logger.info("新建文件 "+fileName);} catch (IOException e) {logger.info(e.toString());}} }}
测试类
package com.bestcxx.mavenstu.mavenssh.file;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.junit.Ignore;import org.junit.Test;import com.bestcxx.mavenstu.mavenssh.util.EnumUtil;public class FileOfficeExcelTest {private static Logger logger=LogManager.getLogger(FileOfficeExcelTest.class);@Test//@Ignorepublic void testReadOfficeExcelFile(){FileOfficeExcel f=new FileOfficeExcel();//excel 所在文件夹String excelPath = EnumUtil.FILE_OFFICE_EXCEL_PATH.toString();//excel 名称String excelName = EnumUtil.FILE_OFFICE_EXCEL_NAME.toString();f.readOfficeExcelFile(excelPath,excelName);}@Testpublic void testWriteOfficeExcelFile(){FileOfficeExcel f=new FileOfficeExcel();//excel 所在文件夹String excelPath = EnumUtil.FILE_OFFICE_EXCEL_PATH.toString();//excel 名称String excelName = "test.xlsx";f.writeOfficeExcelFile(excelPath,excelName);}@Testpublic void testCreateOfficeExcelFile(){FileOfficeExcel f=new FileOfficeExcel();//excel 所在文件夹String excelPath = EnumUtil.FILE_OFFICE_EXCEL_PATH.toString();//excel 名称String excelName = "test.xlsx";f.createOfficeExcelFile(excelPath,excelName);}}
本文属于作者原创,转载请声明:http://blog.csdn.net/bestcxx
+20170811 补充+如果生成的文件供下载,fileName为 name.xls或者 name.xlsx格式
OutputStream out = null;try {response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); out = response.getOutputStream();wb.write(out);//Workbook wb = new HSSFWorkbook();out.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (wb != null) {wb.close();}if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}
0 0
- Java操作excel-兼容office 2007版本之后
- JAVA 解析excel兼容2003和2007以后的版本
- Java操作Microsoft Office(Excel) Apache POI
- java里poi操作excel的工具类(兼容各版本)
- 如何安装 Microsoft Office 兼容包,以便能够使用早期版本的 Excel、PowerPoint 和 Word 来打开和保存来自 2007 Office 程序的文件
- 如何让2007Office兼容低版本的文档?
- java操作Excel(Jakarta_POI)以及java调用office宏
- 用Java操作Office 2007
- 用Java操作Office 2007
- 用Java操作Office 2007
- 【java】解析excel文档(兼容全版本)
- Java操作2007之上版本的excel(.xlsx)
- JAVA POI读取Office excel (2003,2007)
- Java POI读取Office excel (2003,2007)
- C# OFFICE WORD EXCEL操作
- java操作Excel xlsx、xls 兼容的处理
- java 读取 Excel兼容2003,2007
- java 读取 Excel 读取兼容2003,2007
- 技术 svn 使用简介
- C/C++ 取整函数ceil(),floor()
- ansible-playbook
- scikit-learn:0.3. 从文本文件中提取特征(tf、tf-idf)、训练一个分类器
- JDK目录结构和文件作用介绍
- Java操作excel-兼容office 2007版本之后
- Android SELinux 调试
- php实现重载
- android框架大全一
- ACM Poj1012 java版本
- 【分析方法论】属性对行为的影响分析
- AT命令测试工具 ATie
- 代码风格(仿Android SDK)
- 移植DynamixelSDK到Android平台