POI excel導出

来源:https://www.cnblogs.com/antlord/archive/2018/01/19/8318010.html
-Advertisement-
Play Games

****************************************************************************************** excel表格導出,使用POI實現 ***************************************** ...


******************************************************************************************

excel表格導出,使用POI實現

******************************************************************************************

 

實現導出步驟

——配置導出excel模板,推薦使用03版xls格式,可以相容高級版本

 

——處理導出數據List<Map<String, String>> 

private List<Map<String, String>> getData(){
    List<Map<String, String>> data = new ArrayList<>();
    Map<String, String> map = null;
    for (int i = 0; i < 5; i++) {
        map = new HashMap<String, String>();
        map.put("listNo", i + "");
        map.put("userName", "name" + i);
        map.put("userAge", "" + (i + 20));
        data.add(map);
    }
    return data;
}

 

——獲取模板xls文件,通過輸入流讀到HSSFWorkbook 對象中

private HSSFWorkbook workbookTemplate() {
    File file = new File("f:/etom/pmms/src/test/resources/bdRoute.xls");
    InputStream is = null;
    HSSFWorkbook workbook = null;
    try {
        is = new FileInputStream(file);
        workbook = new HSSFWorkbook(is);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (null != is) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    return workbook;
}

 

——通過頁簽名獲取頁簽

private HSSFSheet getSheet(HSSFWorkbook workbook) {
    String sheetName = "用戶信息";
    HSSFSheet sheet = workbook.getSheet(sheetName);
    if (null != sheet) {
        return sheet;
    }
    return null;
}

 

——獲取規則,如${userName}

private String getValue(HSSFCell cell){
    int type = cell.getCellType();
    switch (type) {
        case Cell.CELL_TYPE_NUMERIC:
            return Double.toString(cell.getNumericCellValue());
        case Cell.CELL_TYPE_BOOLEAN:
            return Boolean.toString(cell.getBooleanCellValue());
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();
        default:
            return "";
    }
}

 

——設置規則,如${userName}

private void setCellRule(HSSFRow firstDataRow, HSSFRow newRow) {
    HSSFCell cellInRule = null;
    HSSFCell newCell = null;
    for (int i = 0, cellNum = firstDataRow.getLastCellNum(); i < cellNum; i++) {
        cellInRule = firstDataRow.getCell(i);
        newCell = newRow.createCell(i);
        HSSFCellStyle style = cellInRule.getCellStyle();
        newCell.setCellStyle(style);
        String rule = getValue(cellInRule);
        newCell.setCellValue(rule);
    }
}

 

——設置頁簽模板,將內容行複製,行數與數據data的條數一致

// loop複製行的根據,rowCount複製多少行,上面截圖中,複製行是從行號為4開始
private void setSheet(HSSFSheet sheet, int loop, int rowCount) {

HSSFRow newRow = null;
HSSFRow firstDataRow = sheet.getRow(loop - 1);
for (int i = loop, maxRow = loop + rowCount; i < maxRow - 1; i++) {
newRow = sheet.createRow(i);
setCellRule(firstDataRow, newRow);
}
}

 

——具體設置單元格內容

private void setCellValue(HSSFRow row, Map<String, String> rowData) {
    for (int i = 0, cellNum = row.getLastCellNum(); i < cellNum; i++) {
        HSSFCell cell = row.getCell(i);
        if (null == cell) {
            continue;
        }
        String oldValue = getValue(cell);
        Pattern pattern = Pattern.compile(patternRule);
        Matcher matcher = pattern.matcher(oldValue);
        if (matcher.find()) {
            String key = matcher.group(1);
            String value = rowData.getOrDefault(key, "");
            cell.setCellValue(value);
        }
    }
}

 

——設置行內容(通過設置單元格內容)

// 設置內容,單元的範圍是從第loop行開始,到第loop+data.size()行結束
private void setValue(HSSFSheet sheet, int loop, List<Map<String, String>> data) {

HSSFRow row = null;
for (int i = loop - 1, rowNum = loop + data.size(), index = 0; i < rowNum - 1; i++) {
row = sheet.getRow(i);
setCellValue(row, data.get(index++));
}
}

 

——生成excel文件,格式為xls

private void createExcel(HSSFWorkbook workbook,String targetPath){
    File excelFile = new File(targetPath);
    OutputStream os = null;
    try {
        os = new FileOutputStream(excelFile);
        workbook.write(os);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (null != os) {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

——測試

@Test
public void test(){
    List<Map<String, String>> data = getData(); // 獲取導出的數據
    String templatePath = "f:/etom/pmms/src/test/resources/user.xls"; // 模板的地址
    HSSFWorkbook workbook = workbookTemplate(templatePath); // 將模板轉化為HSSFWorkbook對象
    HSSFSheet sheet = getSheet(workbook); // 獲取模板頁簽
    setSheet(sheet, 5, data.size()); // 設置頁簽
    setValue(sheet, 5, data); // 設置單元格內容
    Long timeMillis = System.currentTimeMillis(); // 以當前時間命名導出文件名
    String targetPath = String.format("f:/etom/pmms/src/test/resources/%s.xls", Long.toString(timeMillis)); // 導出文件xls地址
    createExcel(workbook, targetPath); // 導出文件
}

 

——結果展示

 

——合併單元格

private void setRegion(HSSFSheet sheet){
int firstRow = 1; // 單元起始行
int lastRow = 2; // 單元格終止行
int firstCol = 3; // 單元格起始列
int lastCol = 4; // 單元格終止列
CellRangeAddress cellRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
sheet.addMergedRegion(cellRangeAddress);
}

 

——插入圖片(圖片已保存在資源中)

public void insertBatch(HSSFWorkbook workbook) throws IOException {
    HSSFSheet sheet = workbook.getSheetAt(0);
    HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // 獲取頁簽繪畫組件
  // 定義位置坐標對象HSSFClientAnchor,param1:向右偏移,param2:向下偏移,param3:向左偏移,param4:向上偏移,param5:起始列,param6:起始行,param7:終點列,param8:終點行
    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 7, (short) 7, (short) 20, (short) 20); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); File picture = new File("f:/etom/pmms/pmms/src/test/resources/user.png"); ImageIO.write(ImageIO.read(picture), "png", baos);
// 通過圖片流處理工具ImageIO將圖片讀取後保存在byte流中

patriarch.createPicture(anchor, workbook.addPicture(baos.toByteArray(), 6)); // 繪畫組件執行插入圖片,param1:坐標對象,param2:圖片信息,param3:圖片格式 6代表png格式 File target = new File("f:/etom/pmms/pmms/src/test/resources/userPicture.xls"
); workbook.write(new FileOutputStream(target)); }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、工廠模式(Factory Pattern)的介紹 工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的介面來指向新創建的對象。使用工廠模式可能會多做一些工作,但會給你系統帶來更大的可擴展性和 ...
  • Django創建基本流程 1、創建工程:django-admin startproject 工程名 2、創建應用:python manage.py startapp 應用名 3、激活項目:修改settings.py文件中的INSTALLED_APPS。在該列表的最後加上‘應用名’ 4、配置mysql ...
  • PHP sleep函數一般用於定時執行任務中,表示延遲多少秒在執行程式。這裡主機吧主要給大家講一下sleep函數的語法和應用實例。 sleep函數語法: 應用實例: ...
  • typedef 是C語言提供的一種高級數據特性,它能幫助我們給某一類型創建我們自己的名字,方便我們編碼和使用。 ...
  • 昨天我們使用了dlib和opencv進行了人臉檢測標註(http://www.cnblogs.com/take-fetter/p/8310298.html) 但是運行環境是基於windows的而且可能因為我的電腦上的visual studio配置比較完備,安裝運行沒有出現任何問題. 因為之後我打算把 ...
  • 迭代器 可迭代對象:可迭代對象實現了__iter__方法,該方法返回一個迭代器對象。 迭代器: 那麼什麼迭代器呢?它是一個帶狀態的對象,他能在你調用next()方法的時候返回容器中的下一個值,任何實現了__iter__和__next__(python2中實現next())方法的對象都是迭代器,__i ...
  • 辛苦Mark的 Google公司關於Python的風格規範,emmm~ ...
  • 1. 安裝mysql-python 運行下麵的命令: 安裝以後: 如果沒有出錯,就表明安裝成功。 2. 連接MySQL 其中localhost是伺服器名,root是用戶名,1是密碼,fs是資料庫名稱,前提是MySQL資料庫設置了相應的用戶名和密碼。 連接成功以後,通過 獲取游標。 3. 查詢數據 c ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...