上次在《【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007》(点击打开链接)给出了一种无须额外的Excel包就能够输出Java的内容的到Excel的方案,但是整个方案都是在操作能被Excel读取的.xml文件。构造.xml。这种方法编程起来可能有点麻烦,不够直观。因此,可以利用Apache官方开发的poi插件,实现Java与Excel的交互。
一、基本目标
首先在C盘有个1.xls,里面的内容如下:
然后通过Apache Poi Java插件利用Java可以读取出来,
之后再通过Apache Poi Java插件利用Java输出如下样式:
二、基本准备
1、首先打开Apache Poi的官网http://poi.apache.org/(点击打开链接),按照下图的顺序下载一个最新的稳定BIN版。顺便选择一个镜像,哪个快就搞哪个。
2、在Eclipse中新建一个Java工程,并且在里面新建一个lib文件夹。下载之后解压poi-bin-3.11-20141221.zip,把跟目录下的jar包,lib文件夹里面的jar包,ooxml-lib的Jar包,拷贝到你在Eclipse新建的Java工程下的新建出来的lib文件夹。
3、在Eclipse中为新建的Java工程添加这个额外的Jar插件。右击你新建的Java工程,属性,Java Build Path->Add JARs,选择刚刚拷贝过来lib文件夹的所有jar。那么Apache poi插件正式,在你的JAVA工程下工作。
三、制作过程
1、首先在Java头引入Poi插件。
package poiExcel; //输入输出到文件必备 import java.io.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.*; import org.apache.poi.poifs.filesystem.*;2、先是把C:\1.xls的内容读取到Java里面来,逐个单元格输出
public static void ExcelRead() throws Exception { //确定要操作的是c:/1.xls HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem( new FileInputStream("c:/1.xls"))); //取第0个单元表 HSSFSheet sheet = workbook.getSheetAt(0); //sheet.getPhysicalNumberOfRows();求出所有行数 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { //取一行操作 HSSFRow row = sheet.getRow(i); //row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { System.out.print(row.getCell(j) + "\t"); } System.out.println(); } }3、之后是在Java设置好整个单元格的样式,输出到Excel中。整个过程有点像JavaScript操作HTML的DOM节点。先构造单元格、再通过单元格构造行、最后通过行构造整张表,再把整张表输出的过程。
public static void ExcelWrite() { // 创建一个webbook,对应一个Excel文件 HSSFWorkbook workbook = new HSSFWorkbook(); // 在webbook中添加一个Excel单元表sheet,并设置单元表的问题 HSSFSheet sheet = workbook.createSheet("单元表标题"); // 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制 HSSFRow row = sheet.createRow(0); // 创建一个居中样式 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 在于这个居中样式的基础上,添加表格边框样式 setBoderStyle(style); // 创建第0个单元格 HSSFCell cell = row.createCell(0); // 设置这个单元格的内容为“一” cell.setCellValue("一"); // 设置这个单元格的格式为上面设置好的居中样式+表格边框样式 cell.setCellStyle(style); // 同理创建第1个单元格并且设置好样式,下面以此类推 cell = row.createCell(1); cell.setCellValue("二"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("三"); cell.setCellStyle(style); // 创建第1行 row = sheet.createRow(1); // 清空上面设置好的居中样式+表格边框样式 style = workbook.createCellStyle(); // 设置字体样式 setFontStyle(workbook, style); cell = row.createCell(0); cell.setCellValue("111"); cell.setCellStyle(style); cell = row.createCell(1); cell.setCellValue("222"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("333"); cell.setCellStyle(style); // 自动调整列宽 allColumnAutoSize(sheet); // 将文件存到指定位置 try { //false代表覆盖输出 FileOutputStream fileOutputStream = new FileOutputStream( "c:/1.xls", false); workbook.write(fileOutputStream); //人走带门 fileOutputStream.close(); workbook.close(); } catch (Exception e) { e.printStackTrace(); } }其中,涉及到设置边框样式的方法如下:
public static void setBoderStyle(HSSFCellStyle style) { style.setBorderTop((short) 6); // 上边框为双线 style.setBorderRight((short) 3); // 右边框为虚线 style.setBorderBottom((short) 1); // 底边框为单线 style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色 }设置单元格字体的方法如下:
public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) { HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体 font.setFontHeightInPoints((short) 16);// 字号 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 font.setItalic(true);// 斜体 font.setColor(HSSFColor.RED.index);// 字体颜色是红色 style.setFont(font); // 把这个设置好的字体样色压入样式 }
自动调整列宽的方法如下:
public static void allColumnAutoSize(HSSFSheet sheet) { // 遍历所有单元格,把单元格皆设置为最优列宽。 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { HSSFRow row = sheet.getRow(i); for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { sheet.autoSizeColumn(j); } } }
四、总结
最后整个Java文件如下,主函数就两个方法,一个EXCEL到JAVA,一个JAVA到EXCEL。实际应用这个插件,创建单元格完全可以利用for与while等循环,从一个ArrayList读取数据,不停地填充单元格。
package poiExcel; //输入输出到文件必备 import java.io.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.*; import org.apache.poi.poifs.filesystem.*; public class poiTest { public static void ExcelRead() throws Exception { //确定要操作的是c:/1.xls HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem( new FileInputStream("c:/1.xls"))); //取第0个单元表 HSSFSheet sheet = workbook.getSheetAt(0); //sheet.getPhysicalNumberOfRows();求出所有行数 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { //取一行操作 HSSFRow row = sheet.getRow(i); //row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { System.out.print(row.getCell(j) + "\t"); } System.out.println(); } } public static void setBoderStyle(HSSFCellStyle style) { style.setBorderTop((short) 6); // 上边框为双线 style.setBorderRight((short) 3); // 右边框为虚线 style.setBorderBottom((short) 1); // 底边框为单线 style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色 } public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) { HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体 font.setFontHeightInPoints((short) 16);// 字号 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 font.setItalic(true);// 斜体 font.setColor(HSSFColor.RED.index);// 字体颜色是红色 style.setFont(font); // 把这个设置好的字体样色压入样式 } public static void allColumnAutoSize(HSSFSheet sheet) { // 遍历所有单元格,把单元格皆设置为最优列宽。 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { HSSFRow row = sheet.getRow(i); for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { sheet.autoSizeColumn(j); } } } public static void ExcelWrite() { // 创建一个webbook,对应一个Excel文件 HSSFWorkbook workbook = new HSSFWorkbook(); // 在webbook中添加一个Excel单元表sheet,并设置单元表的问题 HSSFSheet sheet = workbook.createSheet("单元表标题"); // 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制 HSSFRow row = sheet.createRow(0); // 创建一个居中样式 HSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 在于这个居中样式的基础上,添加表格边框样式 setBoderStyle(style); // 创建第0个单元格 HSSFCell cell = row.createCell(0); // 设置这个单元格的内容为“一” cell.setCellValue("一"); // 设置这个单元格的格式为上面设置好的居中样式+表格边框样式 cell.setCellStyle(style); // 同理创建第1个单元格并且设置好样式,下面以此类推 cell = row.createCell(1); cell.setCellValue("二"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("三"); cell.setCellStyle(style); // 创建第1行 row = sheet.createRow(1); // 清空上面设置好的居中样式+表格边框样式 style = workbook.createCellStyle(); // 设置字体样式 setFontStyle(workbook, style); cell = row.createCell(0); cell.setCellValue("111"); cell.setCellStyle(style); cell = row.createCell(1); cell.setCellValue("222"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("333"); cell.setCellStyle(style); // 自动调整列宽 allColumnAutoSize(sheet); // 将文件存到指定位置 try { //false代表覆盖输出 FileOutputStream fileOutputStream = new FileOutputStream( "c:/1.xls", false); workbook.write(fileOutputStream); //人走带门 fileOutputStream.close(); workbook.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { ExcelRead(); ExcelWrite(); } }