java導出Excel

一個簡單的例子叮盘,實現(xiàn)一個沒有內容的workbook.xls文件

利用Maven引入相關的jar包

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.16</version>
    </dependency>
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import java.io.FileOutputStream;  
import java.io.IOException;  
public class NewWorkbook{  
    publicstaticvoid main(String[] args)throws IOException{  
  
    HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對象  
    FileOutputStream fileOut = new FileOutputStream("workbook.xls");  
    wb.write(fileOut);//把Workbook對象輸出到文件workbook.xls中  
    fileOut.close();  
    }  
} 
HSSF提供給用戶使用的對象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell對象耿战,樣式和格式衅谷,還有輔助操作。有以下幾種對象:

HSSFWorkbook excell的文檔對象
HSSFSheet excell的表單
HSSFRow excell的行
HSSFCell excell的格子單元
HSSFFont excell字體
HSSFName 名稱
HSSFDataFormat 日期格式

在該基礎上對上面的文件進行設置樣式及添加內容
package jakarta;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

public class Excel {

    private HSSFWorkbook workbook;
    private HSSFSheet sheet;
    private String bDate;
    private int year;

    /**
     * 創(chuàng)建行元素
     * @param style    樣式
     * @param height   行高
     * @param value    行顯示的內容
     * @param row1     起始行
     * @param row2     結束行
     * @param col1     起始列
     * @param col2     結束列
     */
    private void createRow(HSSFCellStyle style, int height, String value, int row1, int row2, int col1, int col2){

        sheet.addMergedRegion(new CellRangeAddress(row1, row2, col1, col2));  //設置從第row1行合并到第row2行矿微,第col1列合并到col2列
        HSSFRow rows = sheet.createRow(row1);        //設置第幾行
        rows.setHeight((short) height);              //設置行高
        HSSFCell cell = rows.createCell(col1);       //設置內容開始的列
        cell.setCellStyle(style);                    //設置樣式
        cell.setCellValue(value);                    //設置該行的值
    }

    /**
     * 創(chuàng)建樣式
     * @param fontSize   字體大小
     * @param align  水平位置  左右居中2 居右3 默認居左 垂直均為居中
     * @param bold   是否加粗
     * @return
     */
    private HSSFCellStyle getStyle(int fontSize,int align,boolean bold,boolean border){
        HSSFFont font = workbook.createFont();
        font.setFontName("宋體");
        font.setFontHeightInPoints((short) fontSize);// 字體大小
        if (bold){
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        }
        HSSFCellStyle style = workbook.createCellStyle();
        style.setFont(font);                         //設置字體
        style.setAlignment((short) align);          // 左右居中2 居右3 默認居左
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中1
        if (border){
            style.setBorderRight((short) 2);
            style.setBorderLeft((short) 2);
            style.setBorderBottom((short) 2);
            style.setBorderTop((short) 2);
            style.setLocked(true);
        }
        return style;
    }

    /**
     * 根據(jù)數(shù)據(jù)集生成Excel座慰,并返回Excel文件流
     * @param data 數(shù)據(jù)集
     * @param sheetName Excel中sheet單元名稱
     * @param headNames 列表頭名稱數(shù)組
     * @param colKeys 列key,數(shù)據(jù)集根據(jù)該key進行按順序取值
     * @return
     * @throws IOException
     */
    private InputStream getExcelFile(List<Map> data, String sheetName, String[] headNames,
                                     String[] colKeys, int colWidths[], String bDate) throws IOException {
        this.bDate = bDate;
        workbook = new HSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
        // 創(chuàng)建表頭 startRow代表表體開始的行
        int startRow = createHeadCell( headNames, colWidths);

        // 創(chuàng)建表體數(shù)據(jù)
        HSSFCellStyle cellStyle = getStyle(14,2,false,true); // 建立新的cell樣式
        setCellData(data, cellStyle, startRow, colKeys);

        //創(chuàng)建表尾
        createTailCell(data.size()+4,headNames.length);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        workbook.write(baos);
        byte[] ba = baos.toByteArray();
        ByteArrayInputStream bais = new ByteArrayInputStream(ba);
        return bais;
    }

    /**
     * 創(chuàng)建表頭
     *
     * @param headNames
     * @param colWidths
     */
    private int createHeadCell( String[] headNames, int colWidths[]) {
        // 表頭標題
        HSSFCellStyle titleStyle = getStyle(18,2,true,false);//樣式
        createRow(titleStyle,0x549,"****學院統(tǒng)計報表",0,0,0,headNames.length-1);
        //第二行
        HSSFCellStyle unitStyle = getStyle(12,1,true,false);
        createRow(unitStyle,0x190,"制作單位: ****學院ThoughtWorks工作室",1,1,0,headNames.length-1);

        //第三行左邊部分
        year = Integer.parseInt(bDate.substring(0,4));
        String month = bDate.substring(4,6);
        int m = Integer.parseInt(month)-1;
        Calendar   cal   =   Calendar.getInstance();
        cal.set(Calendar.YEAR,year);
        cal.set(Calendar.MONTH,m);//從0開始 0代表一月 11代表12月
        int   maxDate   =   cal.getActualMaximum(Calendar.DATE);

        sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 1));
        HSSFRow row = sheet.createRow(2);
        row.setHeight((short) 0x190);
        HSSFCell cell = row.createCell(0);
        cell.setCellStyle(getStyle(12,1,true,false));
        cell.setCellValue("時間:"+year+"年"+month+"月"+"01日至"+year+"年"+month+"月"+maxDate+"日");

        //第三行右邊部分
        Date date = new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 3, 5));
        HSSFCell cell2 = row.createCell(3);
        cell2.setCellStyle(getStyle(12,3,true,false));
        cell2.setCellValue("制表時間: "+sdf.format(date));

        //第四行表頭
        boolean b = headNames.length > 0;
        if (b) {
            HSSFRow row2 = sheet.createRow(3);
            row2.setHeight((short) 0x289);
            HSSFCell fcell;

            HSSFCellStyle cellStyle = getStyle(15,2,true,true); // 建立新的cell樣式

            for (int i = 0; i < headNames.length; i++) {
                fcell = row2.createCell(i);

                fcell.setCellStyle(cellStyle);
                fcell.setCellValue(headNames[i]);
                if (colWidths != null && i < colWidths.length) {
                    sheet.setColumnWidth(i, 32 * colWidths[i]);
                }
            }
        }
        return b ? 4 : 3;  //從哪一行開始渲染表體
    }

    /**
     * 創(chuàng)建表體數(shù)據(jù)
     * @param data           表體數(shù)據(jù)
     * @param cellStyle      樣式
     * @param startRow       開始行
     * @param colKeys        值對應map的key
     */
    private void setCellData(List<Map> data, HSSFCellStyle cellStyle, int startRow,
                             String[] colKeys) {
        // 創(chuàng)建數(shù)據(jù)
        HSSFRow row;
        HSSFCell cell;
        int i = startRow;

        if (data != null && data.size() > 0) {
            DecimalFormat df = new DecimalFormat("#0.00");
            for (Map rowData : data) {
                row = sheet.createRow(i);
                row.setHeight((short) 0x279);
                int j = 0;
                for (String key : colKeys) {
                    Object colValue = rowData.get(key);
                    if (key.equalsIgnoreCase("CITYNAME")){
                        colValue = colValue+"XX科技有限公司";
                    }else if (key.equalsIgnoreCase("ORDERSUM")||key.equalsIgnoreCase("TRANSFEE")||key.equalsIgnoreCase("ORDREALSUM")){
                        colValue = df.format(colValue);
                    }
                    cell = row.createCell(j);
                    cell.setCellStyle(cellStyle);
                    if (colValue != null) {
                        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                        cell.setCellValue(colValue.toString());
                    }
                    j++;
                }
                i++;
            }
        }
    }

    /**
     * 創(chuàng)建表尾
     * @param size
     * @param length
     */
    private void createTailCell(int size, int length) {
        HSSFCellStyle remarkStyle1 = getStyle(11,1,false,false);
        createRow(remarkStyle1,0x190,"經核對仑氛,確認以上數(shù)據(jù)真實無誤。",size,size,0,length-2);

        HSSFCellStyle remarkStyle2 = getStyle(10,1,false,false);
        createRow(remarkStyle2,0x160,"(聯(lián)系人:XXX搜贤;聯(lián)系電話:13XXXXXXXX谆沃;郵箱:123456789@qq.com)",size+1,size+1,0,length-2);

        HSSFRow row3 = sheet.createRow(size+2);
        row3.setHeight((short) 0x379);

        sheet.addMergedRegion(new CellRangeAddress(size+3, size+3, 0, 1));
        HSSFRow row4 = sheet.createRow(size+3);
        row4.setHeight((short) 0x190);
        HSSFCell cell4 = row4.createCell(0);
        cell4.setCellStyle(getStyle(11,1,false,false));
        cell4.setCellValue("單位核對人:");

        sheet.addMergedRegion(new CellRangeAddress(size+3, size+3, 2, 4));
        HSSFCell cell15 = row4.createCell(2);
        cell15.setCellStyle(getStyle(11,1,false,false));
        cell15.setCellValue("單位制表人:");

        HSSFCellStyle dateStyle = getStyle(10,3,false,false);
        createRow(dateStyle,0x150,"公司公章                     ",size+8,size+8,0,length-2);

        createRow(dateStyle,0x150,year+"年  月   日",size+9,size+9,0,length-2);

    }


    // 測試
    public static void main(String[] args) throws IOException {
        Excel excel = new Excel();
        List<Map> data = new ArrayList<Map>();

        LinkedHashMap<String, Object> e = new LinkedHashMap<String, Object>();

        e.put("CITYNAME", "北京");
        e.put("ORDERCOUNT", "65");
        e.put("ORDERSUM", 930.38);
        e.put("TRANSFEE", 2.28);
        e.put("ORDREALSUM", 928.10);
        e.put("REMARK", "通過1");
        data.add(e);

        e = new LinkedHashMap<String, Object>();
        e.put("CITYNAME", "上海");
        e.put("ORDERCOUNT", "50");
        e.put("ORDERSUM", 850.34);
        e.put("TRANSFEE", 2.08);
        e.put("ORDREALSUM", 848.26);
        e.put("REMARK", "通過2");
        data.add(e);

        e = new LinkedHashMap<String, Object>();
        e.put("CITYNAME", "蘇州");
        e.put("ORDERCOUNT", "10");
        e.put("ORDERSUM", 112.20);
        e.put("TRANSFEE", 2.20);
        e.put("ORDREALSUM", 55.00);
        e.put("REMARK", "通過3");
        data.add(e);

        e = new LinkedHashMap<String, Object>();
        e.put("CITYNAME", "南京");
        e.put("ORDERCOUNT", "26");
        e.put("ORDERSUM", 210.12);
        e.put("TRANSFEE", 0.51);
        e.put("ORDREALSUM", 2409.61);
        e.put("REMARK", "通過4");
        data.add(e);

        String[] headNames = { "單位名稱", "收入筆數(shù)", "收入金額", "手續(xù)費(2.45‰)", "實際金額","備注" };
        String[] keys = { "CITYNAME",  "ORDERCOUNT", "ORDERSUM","TRANSFEE","ORDREALSUM","REMARK"};
        int colWidths[] = { 300, 200, 200, 200, 200,300 };

        String bDate = "201708";
        InputStream input = (excel.getExcelFile(data, "單位", headNames, keys, colWidths,bDate));

        File f = new File("/home/admin-m/桌面/demo/demo.xls");
        if (f.exists())
            f.delete();
        f.createNewFile();
        FileOutputStream out = new FileOutputStream(f);
        HSSFWorkbook book = new HSSFWorkbook(input);
        book.write(out);
        out.flush();
        out.close();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仪芒,隨后出現(xiàn)的幾起案子唁影,更是在濱河造成了極大的恐慌,老刑警劉巖掂名,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夭咬,死亡現(xiàn)場離奇詭異,居然都是意外死亡铆隘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門南用,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀钠,“玉大人,你說我怎么就攤上這事裹虫≈壮埃” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵筑公,是天一觀的道長雳窟。 經常有香客問我,道長匣屡,這世上最難降的妖魔是什么封救? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮捣作,結果婚禮上誉结,老公的妹妹穿的比我還像新娘。我一直安慰自己券躁,他們只是感情好惩坑,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著也拜,像睡著了一般以舒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慢哈,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天蔓钟,我揣著相機與錄音,去河邊找鬼卵贱。 笑死奋刽,一個胖子當著我的面吹牛瓦侮,可吹牛的內容都是我干的。 我是一名探鬼主播佣谐,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼肚吏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狭魂?” 一聲冷哼從身側響起罚攀,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雌澄,沒想到半個月后斋泄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡镐牺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年炫掐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睬涧。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡募胃,死狀恐怖,靈堂內的尸體忽然破棺而出畦浓,到底是詐尸還是另有隱情痹束,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布讶请,位于F島的核電站祷嘶,受9級特大地震影響,放射性物質發(fā)生泄漏夺溢。R本人自食惡果不足惜论巍,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望风响。 院中可真熱鬧环壤,春花似錦、人聲如沸钞诡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荧降。三九已至接箫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朵诫,已是汗流浹背辛友。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人废累。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓邓梅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邑滨。 傳聞我的和親對象是個殘疾皇子日缨,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容