Java通過apache poi生成excel實(shí)例代碼
首先,jar
maven 添加依賴
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency>
開始以為是poi,然后就直接加poi的依賴,誰知道并沒有所需要的類。查了查才發(fā)現(xiàn)是poi-ooxml
要用到的類
- XSSFWorkbook , 代表一個(gè)excel文檔
- XSSFSheet , 代表文檔中的一個(gè)sheet
- XSSFRow , 代表sheet中的一行
- XSSFCell , 代表row中的每一項(xiàng)的值
最最基本的使用
//創(chuàng)建excel文檔
XSSFWorkbook workbook = new XSSFWorkbook();
//創(chuàng)建sheet
XSSFSheet sheet = workbook.createSheet("sheetName");
int rownum=0;
//創(chuàng)建首行
XSSFRow firstrow = sheet.createRow(rownum++);
int cellnum = 0;
//把保存在titles中的各個(gè)列名,分別在row中創(chuàng)建cell
for(String key : titles){
XSSFCell cell = firstrow.createCell(cellnum++);
cell.setCellValue(key);
}
//下面可以繼續(xù)創(chuàng)建行
//把excel寫到要寫的outputStream中
workbook.write(output);
//最后關(guān)閉
workbook.close();
小例子一枚
利用反射,把bean類中各屬性(用getXxx取出),寫入到excel中
ExcelUtil.java
package me.paul.excelDemo;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
public <T> void getExcel(List<T> list,Class<T> c,OutputStream output) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Map<String,Method> methodMap = new LinkedHashMap<>();
Method[] methods = c.getDeclaredMethods();
for(int i=0;i<methods.length;i++){
Method method = methods[i];
String name = method.getName();
Pattern pattern = Pattern.compile("get(.*)");
Matcher matcher = null;
if((matcher = pattern.matcher(name)).matches()){
name = matcher.group(1);
char ch = name.charAt(0);
char newch = (char) (ch + 32);
name = name.replace(ch,newch);
methodMap.put(name, method);
}
}
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(c.getCanonicalName());
int rownum=0;
XSSFRow firstrow = sheet.createRow(rownum++);
int cellnum = 0;
for(String key : methodMap.keySet()){
XSSFCell cell = firstrow.createCell(cellnum++);
cell.setCellValue(key);
}
for(T t : list){
XSSFRow row = sheet.createRow(rownum++);
cellnum = 0;
for(String key:methodMap.keySet()){
Method method = methodMap.get(key);
//設(shè)置可訪問,之前不知道這方法,所以關(guān)于反射那篇文章有錯(cuò)誤,見諒見諒
method.setAccessible(true);
Object obj = method.invoke(t);
XSSFCell cell = row.createCell(cellnum++);
cell.setCellValue(obj== null ? "":obj.toString());
}
}
workbook.write(output);
workbook.close();
}
}
App.java 進(jìn)行測(cè)試使用
package me.paul.excelDemo;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
public class App {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
List<User> list = new ArrayList<>();
User u = new User();
u.setId(1);
u.setName("Paul");
u.setAge(18);
list.add(u);
u = new User();
u.setId(2);
u.setName("Johnson");
u.setAge(20);
list.add(u);
u = new User();
u.setId(3);
u.setName("David");
u.setAge(22);
list.add(u);
OutputStream output = new FileOutputStream("/home/paul/user.xlsx");
new ExcelUtil().getExcel(list, User.class,output);
output.close();
}
}
測(cè)試結(jié)果截圖

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot如何實(shí)現(xiàn)統(tǒng)一后端返回格式
在前后端分離的項(xiàng)目中后端返回的格式一定要友好,不然會(huì)對(duì)前端的開發(fā)人員帶來很多的工作量。那么SpringBoot如何做到統(tǒng)一的后端返回格式呢?本文將為大家詳細(xì)講講2022-04-04
springboot配置flyway(入門級(jí)別教程)
本文介紹了springboot配置flyway,主要介紹基于SpringBoot集成flyway來管理數(shù)據(jù)庫(kù)的變更,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Netty事件循環(huán)主邏輯NioEventLoop的run方法分析
這篇文章主要介紹了Netty事件循環(huán)主邏輯NioEventLoop的run方法分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
java為什么使用BlockingQueue解決競(jìng)態(tài)條件問題面試精講
這篇文章主要為大家介紹了java為什么使用BlockingQueue解決競(jìng)態(tài)條件問題面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

