用SpringMVC生成一個Excel檔案
通過Java來生成Excel檔案或者匯入一個Excel檔案的資料都需要用到Apache的一個POI包,這裡我就先把這個包提供出來。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
這裡我用的SpringBoot建立的專案,建立過程就不做累述了,直接操刀,開始把資料庫的資料導成一個Excel檔案
正式開始寫這個Demo
1.建立一個ExcelUtil類,這個類就是對Excel進行操作,主要兩個方法。
1-1.exportFile():把資料匯出成一個Excel檔案;
1-2.importFile():把指定檔案的資料匯入進來;
users表結構如下:
id | username | password |
+----+-----------+-----------+
| 1 | yx12156ok | yx27787ok |
| 2 | yangxiang | 123456 |
| 3 | zhangsan | 666666 |
| 4 | wangwu | 999999 |
| 5 | xiaoming | xiaoming
這裡先貼出ExcelUtil類匯入的實現,下面再做詳細解釋:
public class ExcelUtil {
private final String excel2003 = "xls";
private final String excel2007 = "xlsx";
private Workbook workbook;
private Sheet sheet;
private Row row;
private Cell cell;
private CellStyle style;
private File file;
//初始化表結構和生成表頭
public ExcelUtil(String[] titles,File file) {
this.file = file;
String fileName = this.file.getName();
this.workbook = getWorkbook(fileName);
if(workbook == null) return;
this.sheet = this.workbook.createSheet();
this.row = this.sheet.createRow(0);
this.style = this.workbook.createCellStyle();
this.style.setAlignment(CellStyle.ALIGN_CENTER);
for(int i = 0 ; i < titles.length ; i ++) {
cell = row.createCell(i); //建立列
cell.setCellValue(titles[i]); //賦值
cell.setCellStyle(style); //樣式
}
}
public void genertedExportUsersFile(List<Users> data) throws IOException {
//遍歷每一行資料
for(int i = 0; i < data.size() ; i ++) {
int j = 0;
Users user = data.get(i);
row = sheet.createRow(i+1);
row.setRowStyle(style);
row.createCell(j++).setCellValue(Optional.of(user.getId()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(user.getUsername()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(user.getPassword()).orElse(null));
}
}
public void genertedExportStudentFile(List<Student> data) {
//遍歷每一行資料
for(int i = 0,j = 0 ; i < data.size() ; i ++) {
Student student = data.get(i);
row = sheet.createRow(i+1);
row.setRowStyle(style);
row.createCell(j++).setCellValue(Optional.of(student.getId()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(student.getUsername()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(student.getPassword()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(student.getStuname()).orElse(null));
row.createCell(j++).setCellValue(Optional.of(student.getStusex()).orElse(null));
}
}
public void write() throws IOException {
//把資料寫入表格檔案
OutputStream out = new FileOutputStream(this.file);
this.workbook.write(out);
out.close();
}
private Workbook getWorkbook(String fileName) {
//根據檔案字尾名來獲取Excel檔案是2003版的還是2007版的
String type = checkFileType(fileName);
//根據版本的不同例項不同的物件
if(type.equals(this.excel2003))
return new HSSFWorkbook();
else if(type.equals(this.excel2007))
return new XSSFWorkbook();
return null;
}
private String checkFileType(String fileName) {
return fileName.substring(fileName.lastIndexOf(".")+1);
}
}
現在我就來講一講幾個方法的作用:
Constructor方法:對錶結構物件進行初始化以及生產表頭;
genertedExportUsersFile方法:生成表的資料,此時資料應該還未真正寫入;
write方法:把生成的表寫入傳入的File類裡,也就是建立的檔案;
getWorkbook方法:獲取2003版本的或者2007版本的Excel物件;
checkFileType方法:獲取檔案的字尾名。