Apache POI使用

Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API旷余,Apache POI提供API給Java程式對Microsoft Office(Excel猫十、WORD觅闽、PowerPoint、Visio等)格式檔案讀和寫的功能薯嗤。POI為“Poor Obfuscation Implementation”的首字母縮寫豪墅,意為“可憐的模糊實現(xiàn)”。

Apache POI常用的類

HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能铣口。
XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能滤钱。
HWPF - 提供讀寫Microsoft Word DOC97格式檔案的功能。
XWPF - 提供讀寫Microsoft Word DOC2003格式檔案的功能脑题。
HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能件缸。
HDGF - 提供讀Microsoft Visio格式檔案的功能。
HPBF - 提供讀Microsoft Publisher格式檔案的功能叔遂。
HSMF - 提供讀Microsoft Outlook格式檔案的功能他炊。

在開發(fā)中我們經(jīng)常使用HSSF用來操作Excel處理表格數(shù)據(jù),對于其它的不經(jīng)常使用已艰。

HSSF 是Horrible SpreadSheet Format的縮寫痊末,通過HSSF,你可以用純Java代碼來讀取旗芬、寫入舌胶、修改Excel文件捆蜀。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel疮丛,即“用戶模型”和“事件-用戶模型”。

常用的類和方法

HSSFWorkbook :工作簿辆它,代表一個excel的整個文檔
HSSFWorkbook(); // 創(chuàng)建一個新的工作簿
HSSFWorkbook(InputStream inputStream); // 創(chuàng)建一個關(guān)聯(lián)輸入流的工作簿誊薄,可以將一個excel文件封裝成工作簿
HSSFSheet createSheet(String sheetname); 創(chuàng)建一個新的Sheet
HSSFSheet getSheet(String sheetName); 通過名稱獲取Sheet
HSSFSheet getSheetAt(int index); // 通過索引獲取Sheet,索引從0開始
HSSFCellStyle createCellStyle()锰茉; 創(chuàng)建單元格樣式
int getNumberOfSheets(); 獲取sheet的個數(shù)
setActiveSheet(int index); 設(shè)置默認選中的工作表
write();
write(File newFile);
write(OutputStream stream);

HSSFSheet:工作表

HSSFRow createRow(int rownum); 創(chuàng)建新行呢蔫,需要指定行號,行號從0開始
HSSFRow getRow(int index); 根據(jù)索引獲取指定的行
int addMergedRegion(CellRangeAddress region); 合并單元格
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 單元格范圍, 用于合并單元格,需要指定要合并的首行片吊、最后一行绽昏、首列、最后一列俏脊。
autoSizeColumn(int column); 自動調(diào)整列的寬度來適應(yīng)內(nèi)容
getLastRowNum(); 獲取最后的行的索引全谤,沒有行或者只有一行的時候返回0
setColumnWidth(int columnIndex, int width); 設(shè)置某一列的寬度,width=字符個數(shù) * 256爷贫,例如20個字符的寬度就是20 * 256

HSSFRow :行

HSSFCell createCell(int column); 創(chuàng)建新的單元格
HSSFCell setCell(shot index);
HSSFCell getCell(shot index);
setRowStyle(HSSFCellStyle style); 設(shè)置行樣式
short getLastCellNum(); 獲取最后的單元格號认然,如果單元格有第一個開始算,lastCellNum就是列的個數(shù)
setHeightInPoints(float height); 設(shè)置行的高度

HSSFCell:單元格

setCellValue(String value); 設(shè)置單元格的值
setCellType(); 設(shè)置單元格類型漫萄,如 字符串卷员、數(shù)字、布爾等
setCellStyle(); 設(shè)置單元格樣式
String getStringCellValue(); 獲取單元格中的字符串值
setCellStyle(HSSFCellStyle style); 設(shè)置單元格樣式腾务,例如字體毕骡、加粗、格式化
setCellFormula(String formula); 設(shè)置計算公式岩瘦,計算的結(jié)果作為單元格的值挺峡,也提供了異常常用的函數(shù),如求和"sum(A1,C1)"担钮、日期函數(shù)橱赠、字符串相關(guān)函數(shù)、CountIf和SumIf函數(shù)箫津、隨機數(shù)函數(shù)等

HSSFCellStyle :單元格樣式

setFont(Font font); 為單元格設(shè)置字體樣式
setAlignment(HorizontalAlignment align); // 設(shè)置水平對齊方式
setVerticalAlignment(VerticalAlignment align); // 設(shè)置垂直對齊方式
setFillPattern(FillPatternType fp);
setFillForegroundColor(short bg); 設(shè)置前景色
setFillBackgroundColor(short bg); 設(shè)置背景顏色

HSSFFont:字體狭姨,

setColor(short color); // 設(shè)置字體顏色
setBold(boolean bold); // 設(shè)置是否粗體
setItalic(boolean italic); 設(shè)置傾斜
setUnderline(byte underline); 設(shè)置下劃線

HSSFName:名稱

HSSFDataFormat :日期格式化

HSSFHeader : Sheet的頭部

HSSFFooter :Sheet的尾部

HSSFDateUtil :日期工具

HSSFPrintSetup :打印設(shè)置

HSSFErrorConstants:錯誤信息表

Excel中的工作簿、工作表苏遥、行饼拍、單元格中的關(guān)系:

一個Excel文件對應(yīng)于一個workbook(HSSFWorkbook),
一個workbook可以有多個sheet(HSSFSheet)組成田炭,
一個sheet是由多個row(HSSFRow)組成师抄,
一個row是由多個cell(HSSFCell)組成

使用案例

在桌面生成一個Excel文件

     /**
     * 在桌面生成一個Excel文件
     *
     * @throws IOException
     */
    public static void createExcel() throws IOException {
        // 獲取桌面路徑
        FileSystemView fsv = FileSystemView.getFileSystemView();
        String desktop = fsv.getHomeDirectory().getPath();
        String filePath = desktop + "/template.xls";

        File file = new File(filePath);
        OutputStream out = new FileOutputStream(file);
        // 創(chuàng)建工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 創(chuàng)建sheet
        HSSFSheet sheet = workbook.createSheet("Sheet1");
        // 創(chuàng)建行
        HSSFRow row = sheet.createRow(0);
        // 創(chuàng)建單元格
        row.createCell(0).setCellValue("id");
        row.createCell(1).setCellValue("訂單號");
        row.createCell(2).setCellValue("下單時間");
        row.createCell(3).setCellValue("個數(shù)");
        row.createCell(4).setCellValue("單價");
        row.createCell(5).setCellValue("訂單金額");
        // 設(shè)置行高
        row.setHeightInPoints(25);

        HSSFRow row1 = sheet.createRow(1);
        row1.setHeightInPoints(18);
        row1.createCell(0).setCellValue("1");
        row1.createCell(1).setCellValue("No00001");

        // 日期格式化
        HSSFCellStyle cellStyle2 = workbook.createCellStyle();
        HSSFCreationHelper creationHelper = workbook.getCreationHelper();
        cellStyle2.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
        // 設(shè)置列寬
        sheet.setColumnWidth(2, 20 * 256);

        HSSFCell cell2 = row1.createCell(2);
        cell2.setCellStyle(cellStyle2);
        cell2.setCellValue(new Date());

        row1.createCell(3).setCellValue(2);

        // 保留兩位小數(shù)
        HSSFCellStyle cellStyle3 = workbook.createCellStyle();
        cellStyle3.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        HSSFCell cell4 = row1.createCell(4);
        cell4.setCellStyle(cellStyle3);
        cell4.setCellValue(29.5);

        // 貨幣格式化
        HSSFCellStyle cellStyle4 = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setFontName("華文行楷");
        font.setFontHeightInPoints((short) 15);
        font.setColor(HSSFColor.RED.index);
        cellStyle4.setFont(font);

        HSSFCell cell5 = row1.createCell(5);
        cell5.setCellFormula("D2*E2");
        cell5.setCellStyle(cellStyle4);

        // 獲取計算公式的值
        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);
        cell5 = e.evaluateInCell(cell5);
        System.out.println(cell5.getNumericCellValue());

        workbook.setActiveSheet(0);
        workbook.write(out);
        out.close();
    }

讀取Excel,解析數(shù)據(jù)

     /**
     * 讀取Excel教硫,解析數(shù)據(jù)
     */
    public static void readExcel() throws IOException {
        // 獲取桌面路徑
        FileSystemView fsv = FileSystemView.getFileSystemView();
        String desktop = fsv.getHomeDirectory().getPath();
        // 獲取文件路徑
        String filePath = desktop + "/template.xls";

        InputStream in = new FileInputStream(filePath);
        BufferedInputStream bis = new BufferedInputStream(in);
        POIFSFileSystem fileSystem = new POIFSFileSystem(bis);

        // 獲取工作薄
        HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
        // 根據(jù)名字獲取工作表
        HSSFSheet sheet = workbook.getSheet("Sheet1");

        // 獲取最后一行的索引
        int lastRowIndex = sheet.getLastRowNum();
        System.out.println("lastRowIndex:" + lastRowIndex);

        for (int i = 0; i <= lastRowIndex; i++) {
            // 獲取每一行
            HSSFRow row = sheet.getRow(i);
            // 獲取最后一個單元格的索引
            int lastCellIndex = row.getLastCellNum();
            System.out.println("lastCellIndex:" + lastCellIndex);
            for (int j = 0; j < lastCellIndex; j++) {
                // 獲取每個單元格字符類型的值
                String cellValue = row.getCell(j).getStringCellValue();
                System.out.println(cellValue);
            }
        }
        bis.close();
    }

導(dǎo)出和導(dǎo)入

/**
 * @author zlm
 */
@Controller
public class Demo03 {

    @RequestMapping("index.do")
    public String showIndex() {
        return "index";
    }

    /**
     * 導(dǎo)出Excel
     *
     * @param response 響應(yīng)對象
     * @throws Exception
     */
    @RequestMapping("/export.do")
    public void exportExcel(HttpServletResponse response) throws Exception {
        String[] tableHeaders = {"id", "姓名", "年齡"};
        // 創(chuàng)建工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 創(chuàng)建工作表
        HSSFSheet sheet = workbook.createSheet("Sheet1");
        // 創(chuàng)建單元格樣式
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        // 水平對齊方式
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 垂直對齊方式
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        Font font = workbook.createFont();
        font.setColor(HSSFColor.RED.index);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cellStyle.setFont(font);

        // 將第一行的三個單元格合并
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
        HSSFRow row = sheet.createRow(0);
        HSSFCell beginCell = row.createCell(0);
        beginCell.setCellValue("通訊錄");
        beginCell.setCellStyle(cellStyle);

        row = sheet.createRow(1);

        // 創(chuàng)建表頭
        for (int i = 0; i < tableHeaders.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(tableHeaders[i]);
            cell.setCellStyle(cellStyle);
        }

        List<User> users = new ArrayList<User>();
        users.add(new User(1L, "張三", 20));
        users.add(new User(2L, "李四", 21));
        users.add(new User(3L, "王五", 22));

        for (int i = 0; i < users.size(); i++) {
            row = sheet.createRow(i + 2);
            User user = users.get(i);
            row.createCell(0).setCellValue(user.getId());
            row.createCell(1).setCellValue(user.getName());
            row.createCell(2).setCellValue(user.getAge());
        }

        OutputStream out = response.getOutputStream();
        response.reset();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=template.xls");

        workbook.write(out);
        out.flush();
        out.close();
    }

    @RequestMapping("/import.do")
    public void importFromFile(@RequestParam("file") MultipartFile file) throws IOException {
        InputStream in = file.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(in);
        POIFSFileSystem fileSystem = new POIFSFileSystem(bis);
        HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
        HSSFSheet sheet = workbook.getSheetAt(0);

        int lastRowNum = sheet.getLastRowNum();
        System.out.println("lastRowNum:" + lastRowNum);
        for (int i = 2; i <= lastRowNum; i++) {
            HSSFRow row = sheet.getRow(i);
            int id = (int) row.getCell(0).getNumericCellValue();
            String name = row.getCell(1).getStringCellValue();
            int age = (int) row.getCell(2).getNumericCellValue();
            System.out.println(id + "-" + name + "-" + age);
        }
        bis.close();
    }
}

更多參考文章

點擊下載測試項目源碼
提取碼:8j9s

作者:vbirdbest
來源:CSDN
原文:https://blog.csdn.net/vbirdbest/article/details/72870714

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叨吮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞬矩,更是在濱河造成了極大的恐慌茶鉴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件景用,死亡現(xiàn)場離奇詭異涵叮,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門割粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾碗,“玉大人,你說我怎么就攤上這事舀瓢≈枚” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵氢伟,是天一觀的道長榜轿。 經(jīng)常有香客問我,道長朵锣,這世上最難降的妖魔是什么谬盐? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮诚些,結(jié)果婚禮上飞傀,老公的妹妹穿的比我還像新娘。我一直安慰自己诬烹,他們只是感情好砸烦,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绞吁,像睡著了一般幢痘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上家破,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天颜说,我揣著相機與錄音,去河邊找鬼汰聋。 笑死门粪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烹困。 我是一名探鬼主播玄妈,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼髓梅!你這毒婦竟也來了拟蜻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤女淑,失蹤者是張志新(化名)和其女友劉穎瞭郑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸭你,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袱巨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阁谆。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愉老,靈堂內(nèi)的尸體忽然破棺而出场绿,到底是詐尸還是另有隱情,我是刑警寧澤嫉入,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布焰盗,位于F島的核電站,受9級特大地震影響咒林,放射性物質(zhì)發(fā)生泄漏熬拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一垫竞、第九天 我趴在偏房一處隱蔽的房頂上張望澎粟。 院中可真熱鬧,春花似錦欢瞪、人聲如沸活烙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啸盏。三九已至,卻和暖如春骑祟,著一層夾襖步出監(jiān)牢的瞬間宫补,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工曾我, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粉怕,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓抒巢,卻偏偏與公主長得像贫贝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛉谜,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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

  • 使用首先需要了解他的工作原理 1.POI結(jié)構(gòu)與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長城ol閱讀 8,446評論 2 25
  • Apache POI 是用Java編寫的免費開源的跨平臺的 Java API稚晚,Apache POI提供API給Ja...
    玩味Orz閱讀 2,622評論 0 0
  • 轉(zhuǎn)自鏈接 目錄 1.認識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 10,600評論 1 3
  • 轉(zhuǎn)自鏈接 3.項目實踐 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一張工資單 3....
    腿毛褲閱讀 3,462評論 0 0
  • 讀取記事本(txt)中的內(nèi)容時,一直出現(xiàn)亂碼型诚,原因在于記事本的默認編碼是GBK客燕,不是UTF-8。 pom.xml中...
    myfm289閱讀 2,427評論 0 2