<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Java玩轉(zhuǎn)Excel,竟然如此easy~

          共 7467字,需瀏覽 15分鐘

           ·

          2021-02-05 18:29

          來源:https://www.cnblogs.com/deng-cc

          1、POI是什么


          Apache POI - the Java API for Microsoft Documents,顧名思義,Apache的三方包,用來操作微軟office文檔的,多數(shù)時候用來操作excel,所以這里就以excel方面來說明。

          需要引入兩個包,maven地址如下(version 3.9?
          <dependency> <groupId>org.apache.poigroupId> <artifactId>poiartifactId> <version>3.9version>dependency><dependency> <groupId>org.apache.poigroupId> <artifactId>poi-ooxmlartifactId> <version>3.9version>dependency>

          POI的組件列表中,針對excel的主要是HSSF和XSSF組件,前者針對97-2007的通用版excel,即后綴xls;后者針對2007或更高版的excel,即后綴xlsx。官方概要如下:
          HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format.XSSF?is?the?POI?Project's?pure?Java?implementation?of?the?Excel?2007?OOXML?(.xlsx)?file?format.

          2、POI核心類


          面向?qū)ο竺嫦驅(qū)ο?,既然如此,自然去找找一些能表示excel中內(nèi)容的類。


          2.1 工作簿 Workbook


          創(chuàng)建或維護(hù)Excel工作簿的所有類的超接口,Workbook,屬于org.apache.poi.ss.usermodel包。其下有兩個實(shí)現(xiàn)類:

          • HSSFWorkbook : 有讀取.xls 格式和寫入Microsoft Excel文件的方法。它與微軟Office97-2003版本兼容

          • XSSFWorkbook : 有讀寫Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它與MS-Office版本2007或更高版本兼容


          所以在針對不同版本的excel時,需要對應(yīng)以上使用不同的Workbook。構(gòu)造函數(shù)中,常用的:

          HSSFWorkbook
          //直接創(chuàng)建新的HSSFWorkbook()
          //通過輸入流創(chuàng)建HSSFWorkbook(java.io.InputStream s)

          XSSFWorkbook
          //直接創(chuàng)建新的XSSFWorkbook()
          //通過File類創(chuàng)建XSSFWorkbook(java.io.File file)
          //通過輸入流創(chuàng)建XSSFWorkbook(java.io.InputStream is)

          2.2 標(biāo)簽頁 Sheet


          HSSFSheet 和 XSSFSheet 都是Sheet接口的實(shí)現(xiàn)類,Sheet可以使用Workbook的兩個方法獲得:
          workbook.createSheet();workbook.createSheet(String?sheetName);

          2.3 行 Row


          同理,Row是 HSSFRow 和 XSSFRow 的接口,通過Sheet獲?。?/span>
          sheet.createRow(int rownum);

          2.4 單元格 Cell


          同理,Cell是 HSSFCell 和 XSSFCell 的接口,通過Row獲?。?/span>
          row.createCell(int?column);row.createCell(int?column,?int?type);

          3、創(chuàng)建和讀取


          其實(shí)如果能理解面向?qū)ο?,就很簡單了,另外包括字體,公式,超鏈接等,都有對應(yīng)的封裝類,此處只提出了核心的幾個,需要了解更多的需要自行展開。

          例子的話,直接從別人教程里摘出來吧,另,讀取的workbook,可以debug瞅瞅內(nèi)容。

          3.1 創(chuàng)建空白工作簿

          import java.io.*;import org.apache.poi.xssf.usermodel.*;public class CreateWorkBook{ public static void main(String[] args)throws Exception { //Create Blank workbook XSSFWorkbook workbook = new XSSFWorkbook(); //Create file system using specific name FileOutputStream out = new FileOutputStream( new File("createworkbook.xlsx")); //write operation workbook using file out object workbook.write(out); out.close(); System.out.println(" createworkbook.xlsx written successfully"); }}

          3.2 打開現(xiàn)有的工作簿

          ?
          import java.io.*;import org.apache.poi.xssf.usermodel.*;public class OpenWorkBook
          public static void main(String args[])throws Exception File file = new File("openworkbook.xlsx"); FileInputStream fIP = new FileInputStream(file); //Get the workbook instance for XLSX file XSSFWorkbook workbook = new XSSFWorkbook(fIP); if(file.isFile() && file.exists()) { System.out.println( "openworkbook.xlsx file open successfully."); } else { System.out.println( "Error to open openworkbook.xlsx file."); } }}

          4、方法示例:任意對象List轉(zhuǎn)至為Excel文檔(可用注解定義標(biāo)簽名和列名)


          寫了個方法,可以將某個類的List轉(zhuǎn)換為對應(yīng)的Excel文檔,列名如果在不使用注解的情況下默認(rèn)為屬性名:

          類:
          @Excel(name = "學(xué)生標(biāo)簽頁")public class Student {
          @Excel(name = "姓名") private String name;
          private boolean male;
          @Excel(name = "身高") private int height;
          public String getName() { return name; }
          public void setName(String name) { this.name = name; }
          public boolean isMale() { return male; }
          public void setMale(boolean male) { this.male = male; }
          public int getHeight() { return height; }
          public void setHeight(int height) { this.height = height; }}

          測試方法:
          public static void main(String[] args) { List list = new ArrayList(); Student student1 = new Student(); student1.setName("小紅"); student1.setMale(false); student1.setHeight(167);
          Student student2 = new Student(); student2.setName("小明"); student2.setMale(true); student2.setHeight(185);
          list.add(student1); list.add(student2);
          File file = new File("C:/Users/Dulk/Desktop/1314.xls"); createExcel(list, file);}

          輸出結(jié)果:
          ?
          注解:
          import?java.lang.annotation.Retention;import?java.lang.annotation.RetentionPolicy;

          @Retention(RetentionPolicy.RUNTIME)public?@interface?Excel?{????//設(shè)置名稱????public?String?name()?default?"";}

          方法:
          import org.apache.log4j.Logger;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;
          import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;
          /** * Excel的操作工具類 */public class ExcelUtil { private static Logger log = Logger.getLogger(ExcelUtil.class);
          /** * 獲取某個File文件對應(yīng)的Workbook工作簿對象 */ public static Workbook gainWorkbook(File file) throws ExcelException { if (!isExcel(file)) { throw new ExcelException("文件不是Excel類型"); } //如果文件不存在則新建 if (!file.exists()) { try { OutputStream os = new FileOutputStream(file); Workbook workbook = isOlderEdition(file) ? new HSSFWorkbook() : new XSSFWorkbook(); workbook.write(os); log.debug("文件不存在,新建該Excel文件"); os.close();
          } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
          try { InputStream is = new FileInputStream(file); return isOlderEdition(file) ? new HSSFWorkbook(is) : new XSSFWorkbook(is);
          } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
          return null; }
          /** * 判斷某個Excel文件是否是2003-2007通用舊版 */ private static boolean isOlderEdition(File file) { return file.getName().matches(".+\\.(?i)xls"); }
          /** * 判斷文件是否是一個Excel文件 */ private static boolean isExcel(File file) { String fileName = file.getName(); String regXls = ".+\\.(?i)xls"; String regXlsx = ".+\\.(?i)xlsx"; return fileName.matches(regXls) || fileName.matches(regXlsx); }
          /** * 將某個對象的List轉(zhuǎn)換為Excel工作簿 */ public static Workbook createExcel(List list, File file) { String sheetName = "default"; if (list.size() == 0) { return null; }
          Workbook workbook = null; try { Class clazz = list.get(0).getClass(); Field[] fields = clazz.getDeclaredFields(); if (clazz.isAnnotationPresent(Excel.class)) { Excel excel = (Excel) clazz.getAnnotation(Excel.class); sheetName = excel.name(); }
          workbook = gainWorkbook(file); Sheet sheet = workbook.createSheet(sheetName); //創(chuàng)建首行 Row line = sheet.createRow(0); for (int k = 0; k < fields.length; k++) { Cell cell = line.createCell(k); String columnName = fields[k].getName(); if (fields[k].isAnnotationPresent(Excel.class)) { Excel excel = fields[k].getAnnotation(Excel.class); columnName = excel.name(); } cell.setCellValue(columnName); } //創(chuàng)建數(shù)據(jù) for (int i = 1; i <= list.size(); i++) { Row row = sheet.createRow(i); for (int j = 1; j <= fields.length; j++) { Cell cell = row.createCell(j - 1); String fieldName = fields[j - 1].getName(); String fieldFirstLetterUpper = fieldName.substring(0, 1).toUpperCase(); String prefix = "get"; if ("boolean".equals(fields[j - 1].getType().getName())) { prefix = "is"; } String methodName = prefix + fieldFirstLetterUpper + fieldName.substring(1); Method method = clazz.getMethod(methodName); cell.setCellValue(String.valueOf(method.invoke(list.get(i - 1)))); } } log.debug("List讀入完畢"); OutputStream os = new FileOutputStream(file); workbook.write(os); os.close();
          } catch (ExcelException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return workbook; }}

          順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,GitHub地址:

          https://github.com/javadevbooks/books電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點(diǎn)一個star,持續(xù)更新中...


          地址閱讀原文直達(dá)。


          瀏覽 32
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91探花在线 | 国产乱来╳╳A片视频 | 亚洲精品一级黄片 | 免费成人大片 | 免费高清无码 |