POI實現excel的導入導出


一。導入到excel

注:本文是在之前ssm框架基礎上引入的POI

1.引入依賴

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.9</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.9</version>
    </dependency>

2.編寫POIUtil類

package com.exp.utils;

import com.exp.model.User;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;


public class POIUtil {

public static void export(List<User> userList) throws Exception{
//指定數據存放的位置
OutputStream outputStream = new FileOutputStream("D:\\test.xls");
//1.創建一個工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//2.創建一個工作表sheet
HSSFSheet sheet = workbook.createSheet("test");
//List<User> userList = userService.selectAll();
//構造參數依次表示起始行,截至行,起始列, 截至列
CellRangeAddress region=new CellRangeAddress(0, 0, 0, 3);
sheet.addMergedRegion(region);

HSSFCellStyle style=workbook.createCellStyle();
//水平居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//垂直居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

HSSFRow row1 = sheet.createRow(0);
HSSFCell cell = row1.createCell(0);
//設置值,這里合並單元格后相當於標題
cell.setCellValue("人員信息表");
//將樣式添加生效
cell.setCellStyle(style);

for(int i = 0;i<userList.size();i++){
//行
HSSFRow row = sheet.createRow(i+1);
//對列賦值
row.createCell(0).setCellValue(userList.get(i).getId());
row.createCell(1).setCellValue(userList.get(i).getName());
row.createCell(2).setCellValue(userList.get(i).getPassword());
row.createCell(3).setCellValue(userList.get(i).getRemark());
}
workbook.write(outputStream);
outputStream.close();
}


}

在TestController中

3.測試

訪問:http://localhost:8080/ssm2/test

在D盤會生成一個test.xls文件打開后如下

 

二。從excel導出到數據庫

 1.編寫POIUtil工具類

public static List<User> importExcel() throws Exception{
        HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File("D:\\t1.xls")));
        HSSFSheet sheet = null;

        for(int i = 0;i < workbook.getNumberOfSheets();i++){
            //獲取每個sheet
            sheet = workbook.getSheetAt(i);
            List<User> list = new ArrayList<User>();
            //getPhysicalNumberOfRows獲取有記錄的行數
            for(int j = 0;j < sheet.getPhysicalNumberOfRows();j++){
                Row row = sheet.getRow(j);
                if(null!=row){
                    //getLastCellNum獲取最后一列
                    User user = new User();
                    for(int k = 0;k < row.getLastCellNum();k++){
                        if(null!=row.getCell(k)){
                            if(k==0){
                                Cell cell = row.getCell(0);
                                //cell->double
                                Double d = cell.getNumericCellValue();
                                //double->int
                                int id = new Double(d).intValue();
                                user.setId(id);
                            }
                            if(k==1){
                                Cell cell = row.getCell(1);
                                //cell->string
                                user.setName(cell.getStringCellValue().toString());
                            }
                            if(k==2){
                                Cell cell = row.getCell(2);
                                user.setPassword(cell.getStringCellValue().toString());
                            }
                            if(k==3){
                                Cell cell = row.getCell(3);
                                user.setRemark(cell.getStringCellValue().toString());
                            }
                        }

                    }
                    list.add(user);


                }

            }
            System.out.println("讀取sheet表:"+ workbook.getSheetName(i) + "完成");
            return list;
        }

        return null;
    }

在編寫工具類的時候遇到的問題總結:

(1)getLastRowNum  

    如果sheet中一行數據都沒有則返回-1,只有第一行有數據則返回0,最后有數據的行是第n行則返回 n-1;

    getPhysicalNumberOfRows  

    獲取有記錄的行數,即:最后有數據的行是第n行,前面有m行是空行沒數據,則返回n-m;

之前寫成getLastRowNum()執行到row.getLastCellNum()=-1,獲取不到excel中的值

(2)如何在循環里將值賦值到一個對象中,我就寫了個if判斷

(3)cell->int和string

2.UserMapper.xml

<insert id="insertData" parameterType="list">
    insert into user(id,name,password,remark) VALUES
    <foreach collection="list" index="index" item="user" separator=",">
      (#{user.id},#{user.name},#{user.password},#{user.remark})
    </foreach>
  </insert>

3.UserMapper和UserService接口一樣

int insertData(List<User> users);

4.UserServiceImpl

@Override
    public int insertData(List<User> users) {
        int num = userMapper.insertData(users);
        return num;
    }

5.TestController

@RequestMapping("/insertData")
    public void insertData() throws Exception{
        List<User> users = POIUtil.importExcel();
        int num = userService.insertData(users);
        if(num > 0){
            System.out.println("插入數據成功");
        }

    }

excel數據在D:/t1.xls,數據如下

6.測試

訪問:http://localhost:8080/ssm2/insertData

 在數據庫中查看如下即成功:

 注:本文只是簡單寫了下POI的導入導出功能,當然POI中還有很多用法有待學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM