java 使用POI導(dǎo)出excel指定字符串顏色

? ? 在做項(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)招拆招解決了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容