Spring Boot學習筆記----POI(Excel匯入匯出)
阿新 • • 發佈:2018-12-30
Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。本文僅用來記錄Excel的部分。畢竟,Excel的匯入匯出,是後臺資料庫常用的方法。
Excel共有兩種格式:xls(03版本)和xlsx(07及之後版本)。POI提供了兩個對應介面類,分別為:HSSFWorkbook和XSSFWorkbook。
那麼如何使用POI呢?
新增Dependence
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId >poi</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>RELEASE</version>
</dependency>
前者用於引入HSSFWorkbook;後者用於引入XSSFWorkbook
版本判斷
在對檔案操作前,需要對版本進行判斷。
public static boolean isExcel2003(String filePath)
{
return filePath.matches("^.+\\.(?i)(xls)$");
}
public static boolean isExcel2007(String filePath)
{
return filePath.matches("^.+\\.(?i)(xlsx)$");
}
匯入Excel
我們仍以之前的Hero為例。將Excel中的資料匯出至List中,程式碼如下。
public List<Hero> importData(File file)
{
Workbook wb = null;
List<Hero> HeroList = new ArrayList();
try
{
if (ExcelUtil.isExcel2007(file.getPath())) {
wb = new XSSFWorkbook(new FileInputStream(file));
} else {
wb = new HSSFWorkbook(new FileInputStream(file));
}
}
catch (IOException e)
{
e.printStackTrace();
return null;
}
Sheet sheet = wb.getSheetAt(0);//獲取第一張表
for (int i = 0; i < sheet.getLastRowNum(); i++)
{
Row row = sheet.getRow(i);//獲取索引為i的行,以0開始
String name= row.getCell(0).getStringCellValue();//獲取第i行的索引為0的單元格資料
int age = row.getCell(1).getNumericCellValue();
if (age==0 && name==null)
{
break;
}
Hero hero=New Hero();
hero.setName(name);
hero.setAge(age);
HeroList.add(hero);
}
try
{
wb.close();
}
catch (IOException e)
{
e.printStackTrace();
}
return HeroList;
}
這裡有兩點需要注意
(1)getLastRowNum()並非獲取實際行數。因此,需要coder自行判斷,是否已經到了最後一行(有效行)。
(2)有些單元格為Numeric格式,帶有指數E。因此,若想獲取其String型別時,需要進行格式轉換。
public static String getStringFromNumericCell(Cell cell)
{
return new DecimalFormat("#").format(cell.getNumericCellValue());
}
匯出Excel
這裡我們將記錄,以模板的形式匯出Excel,即具有某種格式化。
public static void exportHeroInfo(List<Hero> heroList,String templetFilePath, String exportFilePath){
try {
File exportFile=new File(exportFilePath);
File templetFile= new File(templetFilePath);
Workbook workBook;
if(!exportFile.exists()){
exportFile.createNewFile();
}
FileOutputStream out = new FileOutputStream(exportFile);
FileInputStream fis = new FileInputStream(templetFile);
if(isExcel2007(templetFile.getPath())){
workBook=new XSSFWorkbook(fis);
}else {
workBook=new HSSFWorkbook(fis);
}
Sheet sheet=workBook.getSheetAt(0);
int rowIndex = 1 ;
for (Hero item :
heroList) {
Row row=sheet.createRow(rowIndex);
row.createCell(0).setCellValue(item.getHeroAge());
row.createCell(1).setCellValue(item.getHeroName());
rowIndex++;
}
workBook.write(out);
out.flush();
out.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
經過測試,發現可以以模板的格式匯出資料,但對於單元格的邊框效果,似乎不起作用。有了解的童鞋,還望指點。
本人是通過新增cellStyle的方式,補充格式的。
單元格格式
若需要對固定的單元格,新增cellStyle。程式碼如下:
(1)建立CellStyle
public static CellStyle setSimpleCellBorder(Workbook workbook){
CellStyle style=workbook.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
style.setBorderTop(BorderStyle.THIN);
style.setAlignment(HorizontalAlignment.CENTER);
return style;
}
(2)為單元格新增CellStyle
public static void inputCell(Row row, int index, String value, CellStyle style){
Cell cell=row.createCell(index);
cell.setCellValue(value);
cell.setCellStyle(style);
}
至此,使用POI對Excel進行匯入匯出小結完畢。