上次在《【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();
}
}