java用poi 生成excel并单元格,字体,样式

1、最近根据客户需求,需要生成要求的excell 格式

索性研究了下用POI 生成这个excel的功能,poi可以合并单元格(合并列,全并行)及字体,边框等,能满足大部分格式样式,写了个简单的测试列子,记录下,以便后续查阅,也给有需要的人参考。


生成生报表文件格式需求如下

java用poi 生成excel并单元格,字体,样式_第1张图片


报表本身简单,中间涉及到合并单元格,答案多选,及答案列下面ABCD选项要填入对答案下面对应列,如:



写了个测试例子,贴上代码:

package test.zhang.com;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;

public class Test {

	/**
	 * POI版本是3.6
	 * 
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("sheet name");

		sheet.addMergedRegion(new CellRangeAddress(1, //从2行开始 
				2, //到3行结束(合并1到2行)
				1, //从start列开始
				1 //到第end列结束(合并start到end之间的列)
				));
		HSSFRow row = sheet.createRow(1);
		HSSFCell cell = row.createCell(1);
		cell.setCellValue("合并2,3行");

		// 1.生成字体对象
		HSSFFont font = wb.createFont();
		font.setFontHeightInPoints((short) 10);
		font.setFontName("新宋体");
		font.setColor(HSSFColor.BLUE.index);
		font.setBoldweight((short) 0.8);
		
		// 2.生成样式对象
		HSSFCellStyle style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		style.setFont(font); // 调用字体样式对象
		style.setWrapText(true);
		// 增加表格边框的样式 例子
		style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);
		style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);
		style.setTopBorderColor(HSSFColor.GOLD.index);
		style.setLeftBorderColor(HSSFColor.PLUM.index);

		// 3.单元格应用样式
		cell.setCellStyle(style);
		
		int start = 5;
		int end = start + 4;
		for(int tnum = 0;tnum < 3;tnum++){
			sheet.addMergedRegion(new CellRangeAddress(0, //从0行开始 
					0, //到0行结束(就是不合并行)
					start, //从start列开始
					end //到第end列结束(合并start到end之间的列)
					));
			start = end  + 2;//end + 1 列不合并
			end = start + 4;//从end + 2 行开始合并(包括end + 2行)合并5个列
		}
		
		HSSFCellStyle style0 = wb.createCellStyle();
		style0.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		style0.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		
		HSSFRow row0 = sheet.createRow(0);
		for(int i = 0;i < 25;i ++){
			HSSFCell cell00 = row0.createCell(i);
			cell00.setCellValue("test" + i);
			cell00.setCellStyle(style0);
			
		}
		
		
		// 一下代码表示在D3 cell 插入一段字符串
		HSSFRow row2 = sheet.createRow(2);
		HSSFCell cell23 = row2.createCell(3);
		cell23.setCellValue("我就是个测试值 ");
		HSSFCell cell22 = row2.createCell(2);
		cell22.setCellValue(new HSSFRichTextString("啦啦撒哈拉"));

		// 生成文件
		FileOutputStream fileOut = new FileOutputStream("test.xls");
		wb.write(fileOut);
		fileOut.close();
	}

}


运行生成文件内容:


基本满足要求,其它把ABCD填入对应列就好实现了。




你可能感兴趣的:(代码记录)