上文已经讲到了何如使用POI生成一个Excel表格。具体链接:Java POI导出Excel(一) 本章节主要讲的是POI生成样式和隔行换色,话不多少。开始吧
众所周知,Excel的单元格边框是有上下左右构成的,在POI中同样也是需要设置上下左右的单元格边框样式的,实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
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;
public class WorkbookExample4 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
//创建第一行
Row row = sheet.createRow(1);
//设置B2的值
row.createCell(1).setCellValue(100.22222222222222222d);
//设置数据类型
//setCellType(0)是一个过时的方法,并不建议使用
//row.getCell(0).setCellType(0);
//设置保留2位小数
row.getCell(1).setCellType(CellType.NUMERIC);
//设置保留小数位
DataFormat format = wb.createDataFormat();
CellStyle style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.00"));
//设置边框
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
row.getCell(1).setCellStyle(style);
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
为了更容易的看出表格框线的效果,我将填充的单元格换成B2。更容易看到效果,效果如下:
此处把单元格居中单独拉出来将是因为这里有坑,希望用的时候注意一下。实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class WorkbookExample5 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
//创建第一行
Row row = sheet.createRow(1);
//设置A1的值
row.createCell(1).setCellValue(100.22222222222222222d);
//设置数据类型
//setCellType(0)是一个过时的方法,并不建议使用
//row.getCell(0).setCellType(0);
//设置保留2位小数
row.getCell(1).setCellType(CellType.NUMERIC);
//设置保留小数位
DataFormat format = wb.createDataFormat();
CellStyle style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.00"));
//设置边框
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
//设置单元格文字居中
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
row.getCell(1).setCellStyle(style);
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
运行结果如下:
这里有几点要注意一下:
1、关于设置居中的时候类不要用错了。有一个很相似的类,是这个类。
2、网上找的许多代码都是采用数字直接设置的办法来设置的,但是现在那些方法是过时方法。推荐使用我用的这个方法。
现实我们在使用时一般会遇到需要更改单元格的宽高的修改,一般Excel是统一的大小格式实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class WorkbookExample6 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
// 读入文件流
InputStream inputStream = new FileInputStream(new File(path));
// 创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
// 一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
// 设置单元格默认的高度,换算方法是 Excel中的磅 = 500 / 20;
sheet.setDefaultRowHeight((short) 500);
// 创建第一行
Row row = sheet.createRow(1);
// 根据每一行设置单元的的宽度 ,这里 30 * 256 即在Excel中接近30磅的距离
sheet.setColumnWidth(1, 30 * 256);
// 设置A1的值
row.createCell(1).setCellValue(100.22222222222222222d);
// 设置数据类型
// setCellType(0)是一个过时的方法,并不建议使用
// row.getCell(0).setCellType(0);
// 设置保留2位小数
row.getCell(1).setCellType(CellType.NUMERIC);
// 设置保留小数位
DataFormat format = wb.createDataFormat();
CellStyle style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.00"));
// 设置边框
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
// 设置单元格文字居中
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
row.getCell(1).setCellStyle(style);
// 输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
输出结果为:
字体,就很尴尬,因为Workbook类不支持自定义字体,实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
public class HSSFWorkbookExample2 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example2-export.xls";
public static void main(String[] args) throws Exception {
// 读入文件流
InputStream inputStream = new FileInputStream(new File(path));
// 创建Excel对象
HSSFWorkbook wb = new HSSFWorkbook(inputStream);
// 一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
// 创建第一行
Row row = sheet.createRow(1);
/*
* 因为只有HSSFCellStyle类才有自定义的方法,然而Workbook并不能提供。
* 从而导致如果要自定义颜色,那么意味着Excel只能用2007以下的版本
*/
CellStyle style = wb.createCellStyle();
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置字体加粗
Font font = wb.createFont();
font.setBold(true);
style.setFont(font);
// 设置A1的值
row.createCell(1).setCellValue("A1");
row.getCell(1).setCellStyle(style);
// 输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
输出结果为:
修改单元格的自定义颜色是真的坑,Workbook类依旧还是还不支持边框的颜色操作,反正我试了好久是没有尝试出来,如果哪位大佬知道不妨赐教一下。那么就看一下我们如何设置单元格的边框吧。实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
public class HSSFWorkbookExample3 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example2-export.xls";
public static void main(String[] args) throws Exception {
// 读入文件流
InputStream inputStream = new FileInputStream(new File(path));
// 创建Excel对象
HSSFWorkbook wb = new HSSFWorkbook(inputStream);
// 一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
// 创建第一行
Row row = sheet.createRow(1);
/*
* 因为只有HSSFCellStyle类才有自定义的方法,然而Workbook并不能提供。
* 从而导致如果要自定义颜色,那么意味着Excel只能用2007以下的版本
*/
CellStyle focusStyle = wb.createCellStyle();
focusStyle.setBorderTop(BorderStyle.THIN);
focusStyle.setBorderBottom(BorderStyle.THIN);
focusStyle.setBorderLeft(BorderStyle.THIN);
focusStyle.setBorderRight(BorderStyle.THIN);
focusStyle.setAlignment(HorizontalAlignment.CENTER);
focusStyle.setVerticalAlignment(VerticalAlignment.CENTER);
/*
* 这里是必须要设置一个色值来让单元格颜色变成自定义颜色,否则颜色就会变成黑色。
*/
focusStyle.setFillForegroundColor(HSSFColor.LIME.index);
// solid 填充 foreground 前景色
focusStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
HSSFPalette datapal = wb.getCustomPalette();
datapal.setColorAtIndex(HSSFColor.LIME.index, (byte) 244, (byte) 244, (byte) 244);
// 设置A1的值
row.createCell(1).setCellValue("A1");
row.getCell(1).setCellStyle(focusStyle);
// 输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
输出结果为:
很尴尬的是墙内居然没有Excel隔行换色的代码,于是自己花了点时间自己撸了一个出来,代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
public class HSSFWorkbookExample4 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example2-export.xls";
private static int count = 0;
public static void main(String[] args) throws Exception {
// 读入文件流
InputStream inputStream = new FileInputStream(new File(path));
// 创建Excel对象
HSSFWorkbook wb = new HSSFWorkbook(inputStream);
// 一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
// 创建第一行
Row row1 = sheet.createRow(1);
Row row2 = sheet.createRow(2);
createRow(row1, wb);
createRow(row2, wb);
// 输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
private static void createRow(Row row, HSSFWorkbook wb) {
// 数据格式
CellStyle dataStyle = wb.createCellStyle();
dataStyle.setBorderTop(BorderStyle.THIN);
dataStyle.setBorderBottom(BorderStyle.THIN);
dataStyle.setBorderLeft(BorderStyle.THIN);
dataStyle.setBorderRight(BorderStyle.THIN);
dataStyle.setAlignment(HorizontalAlignment.CENTER);
dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);
dataStyle.setFillForegroundColor(HSSFColor.WHITE.index);
dataStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 换色行的样式
CellStyle focusStyle = wb.createCellStyle();
focusStyle.setBorderTop(BorderStyle.THIN);
focusStyle.setBorderBottom(BorderStyle.THIN);
focusStyle.setBorderLeft(BorderStyle.THIN);
focusStyle.setBorderRight(BorderStyle.THIN);
focusStyle.setAlignment(HorizontalAlignment.CENTER);
focusStyle.setVerticalAlignment(VerticalAlignment.CENTER);
/*
* 这里是必须要设置一个色值来让单元格颜色变成自定义颜色,否则颜色就会变成黑色。
*/
focusStyle.setFillForegroundColor(HSSFColor.LIME.index);
// solid 填充 foreground 前景色
focusStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
HSSFPalette datapal = wb.getCustomPalette();
datapal.setColorAtIndex(HSSFColor.LIME.index, (byte) 244, (byte) 244, (byte) 244);
for (int i = 0; i < 8; i++) {
row.createCell(i).setCellValue("单元格:" + i);
if (count % 2 != 0) {
row.getCell(i).setCellStyle(focusStyle);
} else {
row.getCell(i).setCellStyle(dataStyle);
}
}
count++;
}
}
输出结果如下:
Java POI 导出Excel到这里基本上就介绍完了,后面我会抽时间把Java POI导出Word写了,POI之旅应该就结束了。如果觉得看完觉得对您有帮助请点个关注和喜欢都可以。谢谢!