JAVA分多個sheet寫入excel

JAVA將一個字符串數(shù)組直接寫入csv文件比較容易扒吁,直接用jar包javacsv里的CsvWriter類就可以了,具體用法如下:

1.首先在pom中引入jar包(為了方便管理拐叉,我用的maven常遂,當然你也可以直接在lib中加入此包诫给,maven的具體用法我稍后整理完發(fā)布镀钓。)

    <dependencies>
        <dependency>
            <groupId>net.sourceforge.javacsv</groupId>
            <artifactId>javacsv</artifactId>
            <version>2.0</version>
        </dependency>
    </dependencies>

2.然后就可以利用引用的類完成寫入了,比如:

public static void writeList(String[] fileList) throws IOException {
        CsvWriter cw = new CsvWriter("jobList.csv", ',', Charset.forName("utf8"));
        String headers = new String[]{"姓名","語文","數(shù)學"};
        cw.writeRecord(headers);//寫入最上面的一行標題
        for (String file : fileList) {
            cw.writeRecord(new String[]{file});
            ArrayList<String[]> jobList = fileParsing(new File(JOB_FOLDER + "\\" + file));
//此處fileParsing是一個將JOB_FOLDER這個文件里所有文件的內(nèi)容讀取到一個list的方法祭务,有空再總結(jié)那部分內(nèi)容内狗。
            for (String[] job : jobList) {
                cw.writeRecord(job);
            }
        }
        cw.close();
    }

直接new一個CsvWriter對象,然后調(diào)用writeRecord方法义锥,參數(shù)就是你要寫入的字符串數(shù)組(每一行就是一個數(shù)組柳沙,每個數(shù)組的長度可以不同,寫入時按從左到右依次將數(shù)組的每一個元素對應到當行的每一列拌倍。)赂鲤,是不是很簡單~SO EASY~

但是要分門別類的按照sheet寫入就比較麻煩了,網(wǎng)上找到一個比較完整的可以直接拿來用的類柱恤,稍微修改了下数初,可以保存為工具類:
首先當然還是先在pom里添加依賴的jar包poi:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.12</version>
        </dependency>

重點來了,工具類:

package com.src.factory;

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 java.io.OutputStream;
import java.util.List;

public class ExportExcelUtils {

    /**
     * @Title: exportExcel
     * @Description: 導出Excel的方法
     * @param workbook
     * @param sheetNum (sheet的位置梗顺,0表示第一個表格中的第一個sheet)
     * @param sheetTitle  (sheet的名稱)
     * @param headers    (表格的標題)
     * @param result   (表格的數(shù)據(jù))
     * @param out  (輸出流)
     * @throws Exception
     */
    public void exportExcel(HSSFWorkbook workbook, int sheetNum,
                            String sheetTitle, String[] headers, List<List<String>> result,
                            OutputStream out) throws Exception {
        // 生成一個表格
        HSSFSheet sheet = workbook.createSheet();
        workbook.setSheetName(sheetNum, sheetTitle);
        // 設(shè)置表格默認列寬度為20個字節(jié)
        sheet.setDefaultColumnWidth(50);
        // 生成一個樣式
        HSSFCellStyle style = workbook.createCellStyle();
        // 設(shè)置這些樣式
        style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 生成一個字體
        HSSFFont font = workbook.createFont();
        font.setColor(HSSFColor.BLACK.index);
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字體應用到當前的樣式
        style.setFont(font);

        // 指定當單元格內(nèi)容顯示不下時自動換行
        style.setWrapText(true);

        // 產(chǎn)生表格標題行
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            //cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text.toString());
        }
        // 遍歷集合數(shù)據(jù)泡孩,產(chǎn)生數(shù)據(jù)行
        if (result != null) {
            int index = 1;
            for (List<String> m : result) {
                row = sheet.createRow(index);
                int cellIndex = 0;
                for (String str : m) {
                    HSSFCell cell = row.createCell(cellIndex);
                    //cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                    cell.setCellValue(str.toString());
                    cellIndex++;
                }
                index++;
            }
        }
    }

}

用法舉例:

 public static void writeXls(String[] fileList) {
        try {
            OutputStream out = new FileOutputStream("fileList.xls");
            ExportExcelUtils eeu = new ExportExcelUtils();
            HSSFWorkbook workbook = new HSSFWorkbook();
            List<List<String>> data = new ArrayList<List<String>>();

            int i=0;
            for (String file : fileList) {
                ArrayList<String[]> jobList = fileParsing(new File(FILE_FOLDER + "\\" + file));
                data.clear();
                for(String[] job: jobList){
                    data.add(Arrays.asList(job)); //java的這個方法很給力,可以直接把字符串數(shù)組轉(zhuǎn)換為list
                }
                eeu.exportExcel(workbook, i++, file, headers, data, out);
                    //原理就是將所有的數(shù)據(jù)一起寫入荚守,然后再關(guān)閉輸入流珍德。
            }
            workbook.write(out);
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

有了上面的工具類,也挺簡單的矗漾,跟寫入csv不同的是,參數(shù)不再是字符串數(shù)組薄料,而是List<List<String>> 這種敞贡,我這里是偷了個懶,直接將上面那種字符串數(shù)組格式用Arrays的asList()方法轉(zhuǎn)成了字符串list的list摄职。如果方便誊役,可以從一開始就調(diào)整好格式,省得轉(zhuǎn)來轉(zhuǎn)去燒腦谷市,舉個給data塞數(shù)據(jù)的最簡單的例子:

        List<List<String>> data = new ArrayList<List<String>>();
            for (int i = 1; i < 5; i++) {
                List rowData = new ArrayList();
                rowData.add(String.valueOf(i));
                rowData.add("java");
                data.add(rowData);
    }

這里一條rowData是要寫入的一行蛔垢,data是寫入一個sheet的格式。一般我們調(diào)用exportExcel把所有sheet的數(shù)據(jù)都準備好迫悠,最后調(diào)用一次write方法寫入鹏漆,然后關(guān)閉輸入流。所以雖然這個工具類很好用,數(shù)據(jù)的正確組織還是個難點艺玲,這里我踩了很多坑括蝠,合適的話可以參考我上面的代碼,但由于需求可能各不相同饭聚,數(shù)據(jù)源也不一定什么格式忌警,這里無法一一列舉,只能幫到這里秒梳,剩下的就靠你們自己了法绵。

再啰嗦一點感慨:所以一個好的程序員具備清晰的邏輯思維、腦筋清楚是很重要的酪碘,大家都只看到了程序員敲行代碼實現(xiàn)一個功能得簡單礼烈,不一定看到我們燈下冥思苦想一個解決方案時的困難,稍微不小心哪里沒有考慮周全婆跑,說不定就要為了找bug調(diào)功能徹夜加班此熬。一句話:生活不易,大家加油滑进!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犀忱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扶关,更是在濱河造成了極大的恐慌阴汇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节槐,死亡現(xiàn)場離奇詭異搀庶,居然都是意外死亡,警方通過查閱死者的電腦和手機铜异,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門哥倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揍庄,你說我怎么就攤上這事咆蒿。” “怎么了蚂子?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵沃测,是天一觀的道長。 經(jīng)常有香客問我食茎,道長蒂破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任别渔,我火速辦了婚禮附迷,結(jié)果婚禮上惧互,老公的妹妹穿的比我還像新娘。我一直安慰自己挟秤,他們只是感情好壹哺,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艘刚,像睡著了一般管宵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀甚,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天箩朴,我揣著相機與錄音,去河邊找鬼秋度。 笑死炸庞,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的荚斯。 我是一名探鬼主播埠居,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼事期!你這毒婦竟也來了滥壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兽泣,失蹤者是張志新(化名)和其女友劉穎绎橘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唠倦,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡称鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稠鼻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冈止。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枷餐,靈堂內(nèi)的尸體忽然破棺而出靶瘸,到底是詐尸還是另有隱情,我是刑警寧澤毛肋,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站屋剑,受9級特大地震影響润匙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唉匾,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一孕讳、第九天 我趴在偏房一處隱蔽的房頂上張望匠楚。 院中可真熱鬧,春花似錦厂财、人聲如沸芋簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与斤。三九已至,卻和暖如春荚恶,著一層夾襖步出監(jiān)牢的瞬間撩穿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工谒撼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留食寡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓廓潜,卻偏偏與公主長得像抵皱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辩蛋,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容