? ? 在做項(xiàng)目的時(shí)候遇到過(guò)很多奇葩的需求,其中一個(gè)是:導(dǎo)出excel報(bào)表,報(bào)表要求按照指定格式導(dǎo)出,問(wèn)題就出在這個(gè)指定格式上面,什么居中,合并單元格這些基本需求就不細(xì)說(shuō)了,其中一個(gè)要求是導(dǎo)出報(bào)表中一列字段是由多條記錄查詢統(tǒng)計(jì)拼接出來(lái)的,要求把拼接的時(shí)候其中重復(fù)的值標(biāo)紅展示。
? ? 剛看見(jiàn)這個(gè)需求的時(shí)候就呆住了,poi能實(shí)現(xiàn)這個(gè)功能嗎?好像沒(méi)有見(jiàn)過(guò)這樣用呀,不都是一個(gè)一個(gè)單元格設(shè)置style嗎?于是急不可耐的去查找API,網(wǎng)上各種搜索,終于讓我找到了;
????POI中的HSSFFont 是用來(lái)設(shè)置樣式的,但是一直以來(lái)都是使用cellStyle.setFont(font);直接給單元格設(shè)置整體屬性,這次才知道原來(lái)可以同個(gè)給HSSFRichTextString 來(lái)給單元格中字符串設(shè)置不同的樣式,具體使用方法如下:
import?org.apache.poi.hssf.usermodel.*;
import?org.apache.poi.hssf.util.HSSFColor;
import java.io.File;
import java.io.IOException;
public static void main( String[] args ) throws IOException {
? ? ? ? HSSFWorkbook workbook = new HSSFWorkbook();
? ? ? ? HSSFSheet? sheet = workbook.createSheet("自定義單元格部分內(nèi)容顏色");
? ? ? ? HSSFRow row? = sheet.createRow(5);
? ? ? ? HSSFCell cell = row.createCell(5);
? ? ? ? HSSFCellStyle cellStyle = workbook.createCellStyle();
? ? ? ? HSSFFont font = workbook.createFont();
? ? ? ? font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getColor().getIndex());
? ? ? ? HSSFFont font2 = workbook.createFont();
? ? ? ? font2.setColor(HSSFColor.HSSFColorPredefined.RED.getColor().getIndex());
? ? ? ? font2.setBold(true);
? ? ? ? cellStyle.setFont(font);
? ? ? ? cell.setCellStyle(cellStyle);
? ? ? ? String txt = "abcdefghijklmnopqrsREDtuvwxyzredssssssssssss";
? ? ? ? HSSFRichTextString text = new HSSFRichTextString(txt);
? ? ? ? text.applyFont(txt.indexOf("RED"),txt.indexOf("RED")+3,font2);
? ? ? ? cell.setCellValue(text);
? ? ? ? sheet.autoSizeColumn(5,true);
? ? ? ? File file = new File("C:\\Users\\95398\\Desktop\\我要變成紅色的字體.xls");
? ? ? ? if(file.exists()){
? ? ? ? ? ? file.delete();
? ? ? ? }
? ? ? ? file.createNewFile();
? ? ? ? workbook.write(new FileOutputStream( file ));
? ? }
? ? 但是在這個(gè)測(cè)試類導(dǎo)出之后,的確是變紅了,但是奇怪的是在變紅之后,并沒(méi)有按照我指定的要求,標(biāo)紅中間那一部分,在字符串'RED'之后的部分也標(biāo)紅了,這就奇怪了,不知道是遇見(jiàn)了什么bug,于是想了個(gè)折中的辦法,如下:
? ???String txt = "abcdefghijklmnopqrsREDtuvwxyzredssssssssssss";
? ? ? ? HSSFRichTextString text = new HSSFRichTextString(txt);
? ? ? ? text.applyFont(txt.indexOf("RED"),txt.indexOf("RED")+3,font2);
? ? ? ? text.applyFont(txt.indexOf("RED")+3,txt.length(),font);
? ? ? ? text.applyFont(txt.indexOf("red"),txt.indexOf("red")+3,font2);
? ? ? ? text.applyFont(txt.indexOf("red")+3,txt.length(),font);
? ? ? ? cell.setCellValue(text);
? ? 對(duì),你沒(méi)有看錯(cuò),就是分段式的設(shè)置樣式,這樣就能解決上面遇到的那個(gè)問(wèn)題,但是這個(gè)bug是如何產(chǎn)生的,也沒(méi)有去細(xì)想,畢竟這樣的需求也不多見(jiàn),就見(jiàn)招拆招解決了。