使用Java進行excel操作的幾種方法(上)

2022-01-24 傳智教育博學谷

很久以前,微軟的電子表格軟體Excel操作簡單、存儲數據直觀方便,還支持列印報表,極大的提升了工作的效率,深得白領青睞,不久之後,便成了辦公室裡的必備工具。

隨著更多的新語言的崛起,例如我們所熟悉的Java,後來便有一些團隊開始開發一套能與Excel軟體無縫切換的操作工具!

當然,在Java生態體系裡面,能與Excel無縫銜接的第三方工具還有很多,在開始也給大家列出來三個,因為apache poi在業界使用的最廣泛,因此其他的工具不做過多介紹!

1.1 首先添加依賴

<dependencies>    <!--xls(03)-->    <dependency>        <groupId>org.apache.poi</groupId>        <artifactId>poi</artifactId>        <version>4.1.2</version>    </dependency>    <!--xlsx(07)-->    <dependency>        <groupId>org.apache.poi</groupId>        <artifactId>poi-ooxml</artifactId>        <version>4.1.2</version>    </dependency>    <!--時間格式化工具-->    <dependency>        <groupId>joda-time</groupId>        <artifactId>joda-time</artifactId>        <version>2.10.6</version>    </dependency></dependencies>

1.2 導出excel

導出操作,即使用Java寫出數據到Excel中,常見場景是將頁面上的數據導出,這些數據可能是財務數據,也可能是商品數據,生成Excel後返回給用戶下載文件。

poi工具庫中,導出api可以分三種方式:

HSSF方式: 這種方式導出的文件格式為office 2003專用格式,即.xls,優點是導出數據速度快,但是最多65536行數據

XSSF方式: 這種方式導出的文件格式為office 2007專用格式,即.xlsx,優點是導出的數據不受行數限制,缺點導出速度慢

SXSSF方式: SXSSF是XSSF API的兼容流式擴展,主要解決當使用XSSF方式導出大數據量時,內存溢出的問題,支持導出大批量的excel數據

1.2.1 HSSF方式導出(.xls方式)

HSSF方式,最多只支持65536條數據導出,超過這個條數會報錯!

package cn.tedu.excel.test;
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 java.io.FileOutputStream;
public class ExcelWrite2003Test {    private static  String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {                long begin = System.currentTimeMillis();
               Workbook workbook = new HSSFWorkbook();                Sheet sheet = workbook.createSheet();                for (int rowNumber = 0; rowNumber < 65536; rowNumber++) {                        Row row = sheet.createRow(rowNumber);            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {                                Cell cell = row.createCell(cellNumber);                cell.setCellValue(cellNumber);            }        }        System.out.println("結束!");        FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用戶信息表-XLS.xls");        workbook.write(fileOutputStream);        fileOutputStream.close();        long end = System.currentTimeMillis();        System.out.println("時間為:"+(double) (end - begin) / 1000);    }}

1.2.2 XSSF方式導出(.xlsx)

XSSF方式支持大批量數據導出,所有的數據先寫入內存再導出,容易出現內存溢出!

package cn.tedu.excel.test;
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.FileOutputStream;
public class ExcelWrite2007Test {    public static String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {                long begin = System.currentTimeMillis();
               Workbook workbook = new XSSFWorkbook();                Sheet sheet = workbook.createSheet();                for (int rowNumber = 0; rowNumber < 65537; rowNumber++) {            Row row = sheet.createRow(rowNumber);            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {                Cell cell = row.createCell(cellNumber);                cell.setCellValue(cellNumber);            }        }        System.out.println("結束");
       FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用戶信息表-XLSX.xlsx");        workbook.write(fileOutputStream);        fileOutputStream.close();        long end = System.currentTimeMillis();        System.out.println((double) (end - begin) / 1000);    }}

1.2.3 SXSSF方式導出

SXSSF方式是XSSF方式的一種延伸,主要特性是低內存,導出的時候,先將數據寫入磁碟再導出,避免報內存不足,導致程序運行異常,缺點是運行很慢!

package cn.tedu.excel.test;
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.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
public class ExcelWriteSXSSFTest {    public static String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {                long begin = System.currentTimeMillis();
               Workbook workbook = new SXSSFWorkbook();
               Sheet sheet = workbook.createSheet();
               for (int rowNumber = 0; rowNumber < 100000; rowNumber++) {            Row row = sheet.createRow(rowNumber);            for (int cellNumber = 0; cellNumber < 10; cellNumber++) {                Cell cell = row.createCell(cellNumber);                cell.setCellValue(cellNumber);            }        }        System.out.println("over");
       FileOutputStream fileOutputStream = new FileOutputStream(PATH + "用戶信息表-SXSSF.xlsx");        workbook.write(fileOutputStream);        fileOutputStream.close();        long end = System.currentTimeMillis();        System.out.println((double) (end - begin) / 1000);    }}

1.3 導入excel

導入操作,即將excel中的數據採用java工具庫將其解析出來,進而將excel 數據寫入資料庫!

同樣,在poi工具庫中,導入api也分三種方式,與上面的導出一一對應!

1.3.1 HSSF方式導入

package cn.tedu.excel.test;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.*;import org.joda.time.DateTime;
import java.io.FileInputStream;import java.util.Date;
public class ExcelRead2003Test {    public static String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {                FileInputStream inputStream = new FileInputStream(PATH + "用戶信息表2003read.xls");
               Workbook workbook = new HSSFWorkbook(inputStream);                Sheet sheet = workbook.getSheetAt(0);                Row row = sheet.getRow(0);                Cell cell = row.getCell(0);        getValue(cell);        inputStream.close();    }
   public static void getValue(Cell cell){                if (cell != null) {            CellType cellType = cell.getCellType();            String cellValue = "";            switch (cellType) {                case STRING:                    System.out.print("[String類型]");                    cellValue = cell.getStringCellValue();                    break;                case BOOLEAN:                    System.out.print("[boolean類型]");                    cellValue = String.valueOf(cell.getBooleanCellValue());                    break;                case BLANK:                    System.out.print("[BLANK類型]");                    break;                case NUMERIC:                    System.out.print("[NUMERIC類型]");                    if (HSSFDateUtil.isCellDateFormatted(cell)) {                        System.out.print("[日期]");                        Date date = cell.getDateCellValue();                        cellValue = new DateTime(date).toString("yyyy-MM-dd");                    } else {                                                System.out.print("[轉換為字符串輸出]");                        cell.setCellType(CellType.STRING);                        cellValue = cell.toString();                    }                    break;                case ERROR:                    System.out.print("[數據類型錯誤]");                    break;            }            System.out.println(cellValue);        }    }}
————————————————版權聲明:本文為CSDN博主「經理,天台風好大」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本聲明。原文連結:https:

package cn.tedu.excel.test;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.joda.time.DateTime;
import java.io.FileInputStream;import java.util.Date;
public class ExcelRead2007Test {    public static String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {                FileInputStream inputStream = new FileInputStream(PATH + "用戶信息表2007read.xlsx");
               Workbook workbook = new XSSFWorkbook(inputStream);                Sheet sheet = workbook.getSheetAt(0);                Row row = sheet.getRow(0);                Cell cell = row.getCell(0);        getValue(cell);        inputStream.close();    }    public static void getValue(Cell cell){                if (cell != null) {            CellType cellType = cell.getCellType();            String cellValue = "";            switch (cellType) {                case STRING:                    System.out.print("[String類型]");                    cellValue = cell.getStringCellValue();                    break;                case BOOLEAN:                    System.out.print("[boolean類型]");                    cellValue = String.valueOf(cell.getBooleanCellValue());                    break;                case BLANK:                    System.out.print("[BLANK類型]");                    break;                case NUMERIC:                    System.out.print("[NUMERIC類型]");                    if (HSSFDateUtil.isCellDateFormatted(cell)) {                        System.out.print("[日期]");                        Date date = cell.getDateCellValue();                        cellValue = new DateTime(date).toString("yyyy-MM-dd");                    } else {                                                System.out.print("[轉換為字符串輸出]");                        cell.setCellType(CellType.STRING);                        cellValue = cell.toString();                    }                    break;                case ERROR:                    System.out.print("[數據類型錯誤]");                    break;            }            System.out.println(cellValue);        }    }}

package cn.tedu.excel.test;
import org.apache.poi.ooxml.util.SAXHelper;import org.apache.poi.openxml4j.opc.OPCPackage;import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;import org.apache.poi.xssf.eventusermodel.XSSFReader;import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;import org.apache.poi.xssf.model.StylesTable;import org.apache.poi.xssf.usermodel.XSSFComment;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;
import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.stream.Collectors;
public class ExcelReadSXSSFTest {    public static String PATH = "/Users/lixin/Desktop/";
   public static void main(String[] args) throws Exception {        
               OPCPackage opcPackage = OPCPackage.open(PATH + "用戶信息表2007read.xlsx");        XSSFReader xssfReader = new XSSFReader(opcPackage);        StylesTable stylesTable = xssfReader.getStylesTable();        ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage);                XMLReader xmlReader = SAXHelper.newXMLReader();        xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false));                Iterator<InputStream> sheetsData = xssfReader.getSheetsData();        while (sheetsData.hasNext()) {            try (InputStream inputStream = sheetsData.next();) {                xmlReader.parse(new InputSource(inputStream));            }        }    }        public static class SimpleSheetContentsHandler implements XSSFSheetXMLHandler.SheetContentsHandler {
       protected List<String> row;
       @Override        public void startRow(int rowNum) {            row = new ArrayList<>();        }
       @Override        public void endRow(int rowNum) {            if (row.isEmpty()) {                return;            }                        System.out.println(row.stream().collect(Collectors.joining("   ")));        }
       @Override        public void cell(String cellReference, String formattedValue, XSSFComment comment) {            row.add(formattedValue);        }
       @Override        public void headerFooter(String text, boolean isHeader, String tagName) {        }    }}

相關焦點

  • 使用Java進行excel操作的幾種方法 (下)
    easyexcel是阿里巴巴開源的一款excel解析工具,底層邏輯也是基於apache poi進行二次開發的。不同的是,再讀寫數據的時候,採用sax模式一行一行解析,在並發量很大的情況下,依然能穩定運行!下面就一起來了解一下這款新起之秀!3.1 添加依賴包<!
  • Java如何操作Word, Excel, PDF文檔?
    參考:  http://danadler.com/jacob/  http://jakarta.apache.org/poi/  http://www.onjava.com/pub/a/onjava/2003/01/22/poi.html  http://www.csdn.net/develop/article/15/15311
  • excel中使用函數進行成績排名的方法
    我們在使用excel處理數據時,可以使用函數來對學生的成績排名進行操作,下面就一起來看看excel中使用函數進行成績排名的方法。方法/步驟在桌面上雙擊excel的快捷圖標,將excel軟體打開。打開excel之後,按下Ctrl+O鍵,在彈出的對話框內選擇表格文件,把選擇的表格文件打開,然後選擇排名下面的單元格,在該單元格內輸入排名函數。
  • 沒想到啊,Java操作Excel竟然這麼簡單!
    前言在工作中,使用excel表格處理數據是很常見的操作,本文就來講解下如何使用開源輪子實現下載、導入、導出的功能。在之前,很多Java程式設計師都喜歡使用POI的類庫來操作excel,但是非常的不方便,不僅代碼寫的很臃腫,還要處理各種office版本兼容問題,最怕的就是使用不當很容易造成內存溢出,因此今天給大家推薦阿里的一款開源項目 easyexcel。
  • Python「文件操作」Excel篇(上)
    與word文件的操作庫python-docx類似,Python也有專門的庫為Excel文件的操作提供支持,這些庫包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter幾種,其中我最喜歡用的是openpyxl,這也是本次講解的主要內容。Excel文件大家也不陌生了,平時辦公、學習中都會用到,大家回憶一下,你操作一個Excel文件是什麼步驟呢?
  • 在excel中製作斜線表頭的幾種方法
    我們平常用word製作斜線表頭非常方便,但是很多人喜歡在excel中製作斜線表頭,遺憾的是excel被沒有直接給我們提供方便製作斜線表頭的方法
  • 每日一課 | Apache POI –用Java讀寫Excel文件
    Apache POI庫的基本定義本節簡要介紹有關Excel讀寫期間使用的基本類。HSSF在類名之前添加前綴,以指示與Microsoft Excel 2003文件相關的操作。XSSF在類名之前添加前綴,以指示與Microsoft Excel 2007文件或更高版本相關的操作。
  • excel減法函數的使用方法
    excel是一個神奇的表格,它本身鑲嵌了運算功能,不需要計算器,就可以進行各種運算。
  • 程式設計師:java導出Excel,附帶依賴、後端代碼和前端JS
    org.springframework.core.io.ClassPathResource;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io
  • excel關於函數countifs的操作方法
    關於函數count和countif的操作技巧」中,我們已經介紹了函數countif的基本用法進行了介紹,今天我們要介紹的函數countifs與函數countif密切相關,所以為了更好的理解函數countifs的操作方法,我們將在回顧函數countif的基礎上介紹函數countifs的操作方法。
  • java安全編碼指南之:Number操作
    Number的範圍每種Number類型都有它的範圍,我們看下java中Number類型的範圍:考慮到我們最常用的int操作,雖然int的範圍夠大,但是如果我們在做一些int操作的時候還是可能超出int的範圍。超出了int範圍會發送什麼事情呢?看下面的例子:運行結果:-2147482649。
  • Excel教師操作大全:用Excel篩選內容後,對該內容進行統計的技巧
    日常辦公中,相信老師們對excel表格的使用隨處可見,但是對於很多老師來說,線上辦公技能還是比較生疏的,特別是對於剛剛接觸線上辦公的老師們來說,如何操作常規的辦公軟體,也是較為重要的一項工作;今天就和老師們來聊聊線上辦公中用到最多的工具——excel制表之用excel篩選內容後,對該內容進行統計的操作方法
  • jacob操作office word簡單教程
    word文件比較多,word文件的加密解密,轉換為各種格式,插入圖片,添加水印、html轉word等等各種東西,大家也都知道,java語言是不能直接操作word或者excel的,不像C#,可以調用VBA的類來直接操作office。
  • 辦公軟體操作技巧80:如何在excel中進行換行操作
    在日常工作中,我們使用excel編輯電子表格時,經常需要對單元格中的內容進行換行,如下圖中的名稱列,那麼今天就來和大家分享如何在excel中進行換行操作。電子表格方法一:自動換行選中需要換行的單元格區域——>單擊「開始」菜單——>選擇對齊方式工具組中的「自動換行」選項即可,如下圖;
  • Java 8 中的流操作-基本使用&性能測試
    是否是考慮使用多線程進行並發處理呢?如果是,那麼可能編寫的關於並發的代碼比使用迭代器本身更加的複雜,而且調試起來也會變得麻煩。基於以上的幾點考慮,Java 設計者在 Java 8 版本中,引入了流的概念,來幫助您節約時間!並且有了 lambda 的參與,流操作的使用將更加順暢!
  • 如何使用 Java 靈活讀取 Excel 內容 ?
    Excel 讀操作,很容易造成內存溢出問題。本博文源碼在公眾號:Java後端,後臺回復 excel 獲取。,EasyExcel 通過 @DateTimeFormat 註解進行格式化到這裡,我們只需要將業務邏輯定製在 batchInsert 方法中:滿足 Controller RESTful API 的簡潔性listener 更加通用和靈活,它更多是扮演了抽象類的角色,具體的邏輯交給抽象方法的實現來完成到這裡,關於如何使用
  • java——Scnner()類下面有幾種方法呢?
    extends Object implements Iterator Scanner 使用分隔符模式將其輸入分解為標記,默認情況下該分隔符模式與空白匹配。然後可以使用不同的 next 方法將得到的標記轉換為不同類型的值。
  • word轉excel有什麼好用的方法?具體word轉excel操作分享
    word轉excel有什麼好用的方法?當我們在word中匯總了一些數據時,想要將其內容轉換到excel表格中,一般大家都是怎麼操作呢?如果大家不會對這兩種文件進行轉換的話,可以嘗試一下小編以下的方法,這樣我們就可以很快的完成word到excel表格的轉換了。
  • 文字添加上拼音並分離使用?word和excel配合使用發揮作用
    如何讓你的文字添加上拼音並分離使用?word和excel配合使用發揮作用大家好,很高興又和您見面了,不知道大家有沒有這樣的感受,在平時工作過程中,很多看似很簡單的操作,卻總因為某些地方由於不知道如何正確的操作,導致工作無法正常繼續下去。
  • 如何用pandas對excel中的文本數據進行操作
    excel進行數據的操作最便捷的庫是pandas,但是如何使用pandas對excel中的文本進行清洗,這是一個很技巧性的工作。