Java POI 导出Excel(二)

序言

上文已经讲到了何如使用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隔行换色

很尴尬的是墙内居然没有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之旅应该就结束了。如果觉得看完觉得对您有帮助请点个关注和喜欢都可以。谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值