java用poi 生成excel並單元格,字體,樣式

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

索性研究了下用POI 生成這個excel的功能,poi可以合併單元格(合併列,全並行)及字體,邊框等,能滿足大部分格式樣式,寫了個簡單的測試列子,記錄下,以便後續查閱,也給有需要的人蔘考。


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



報表本身簡單,中間涉及到合併單元格,答案多選,及答案列下面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填入對應列就好實現了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章