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
原创粉丝点击