java中excel文件的导入和导出

如有需要可以加我Q群【308742428】大家一起讨论技术,提供技术支持。

后面会不定时为大家更新文章,敬请期待。

前端上传excel文件到后台,后台接收后保存数据到数据库。

这里需要说明的一点是前端如果是用form提交那么需要在form里添加属性

method='post' enctype="multipart/form-data"

如果是用ajax提交的那么需要在请求方法添加添加

processData: false,
contentType : false, // 不要设置Content-Type请求头

后台接收的action:

这里是把request请求转化为MultipartFile,表示当前请求是一个文件上传

//批量添加
    @ResponseBody
    @RequestMapping(value = "/addAllPersonnel",method = RequestMethod.POST)
    @CrossOrigin
    public Map<String,Object> addpersonnel(HttpServletRequest request) {
        Map<String,Object> map = new HashMap<>();
        try {
            String userToken = request.getParameter("token");
            Administrator user = (Administrator) CacheUtils.get(userToken);
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultipartFile file = multipartRequest.getFile("excel_file");
            // 1.取得上传目录父路径
            String baseDir =request.getServletContext().getRealPath("/")+ "tmp/";
            // 2.重命名上传文件
            String fileName = "excel_" + new Date().getTime()
                    + file.getOriginalFilename().replaceAll("^[\s\S]+(\.\w+)", "$1");
            // 3.建立文件路径
            File _baseDir = new File(baseDir);
            if (!_baseDir.exists() && !_baseDir.mkdir()){
            }
            // 4.转储为文件
            File localFile = new File(baseDir + fileName);
            file.transferTo(localFile);
            personnelService.addAllPersonnel(localFile);
            map.put("code",200);
            map.put("msg","添加成功");
            return map;
        }catch (Exception e){
            map.put("data","");
            map.put("code",400);
            map.put("msg","添加失败");
            return map;
        }
    }

 

service实现类里对应的方法:

Personnel是一个实体类,里面的字段根据需求自己写

 

//批量添加
    public void addAllPersonnel(File file) {
        try {
            // 1.将file文件内容转为list集合
            List<List<Object>> list = ExcelUtils.importExcel2Collection(file, 0);
            // 2.循环生成对象,并存入数据库
            Personnel personnel = new Personnel();
            int size = list.size();
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            for (int i=1;i<size;i++){
                List<Object> tmp = list.get(i);
                String serialnumber = (String) tmp.get(0);
                //学号重复的不添加
                int query = personnelDao.query(serialnumber);
                if (query!=0){
                    continue;
                }
                personnel.setSerialnumber(serialnumber);
                personnel.setUsername((String) tmp.get(1));
                personnel.setType("学生");
                personnel.setGrade((String) tmp.get(2));
                personnel.setBirthday((String) tmp.get(3));
                personnel.setSex("男".equals((String) tmp.get(4))?1:2);
                personnel.setInputtingperson((String) tmp.get(5));
                personnel.setPhone((String) tmp.get(6));
                personnel.setParrent((String) tmp.get(7));
                personnel.setParrentPhone((String) tmp.get(8));
                personnel.setAge((String) tmp.get(9));
                personnel.setGroupManager((String) tmp.get(10));
                personnel.setSchool((String) tmp.get(11));
                personnel.setHint((String) tmp.get(12));
                personnel.setWeight((String) tmp.get(13));
                personnel.setBlood((String) tmp.get(14));
                personnel.setAddress((String) tmp.get(15));
                personnel.setHobby((String) tmp.get(16));
                personnel.setJdTime(simpleDateFormat.format(new java.util.Date()));
                //保存到数据库
                personnelDao.addpersonnel(personnel);
            }
        }catch (Exception e){
            System.out.println(e);
        }
    }

下载excel,这里我是从数据库查出需要都的数据,然后遍历list添加到excel里面。

前端请求地址就是action的地址,主要action我们这里定义的是void没有返回类型。

/**
     * 下载
     * @return
     */
    @ResponseBody
    @RequestMapping("/download")
    @CrossOrigin
    public  void download(Paging paging, String query, HttpServletRequest request, HttpServletResponse response) {
        Map<String,Object> map = new HashMap<>();
        try {
            List<Personnel> likepersonnel = personnelService.likepersonnel(paging);
            if (likepersonnel.size()==0){
                map.put("data","");
                map.put("code",404);
            }else{
                // 文件名
                String filename = "数据.xls";
                ExcelData data = new ExcelData();
                data.setName("数据");
                List<String> titles = new ArrayList();
                titles.add("学号");
                titles.add("姓名");
                titles.add("班级");
                titles.add("出生年月");
                titles.add("性别");
                titles.add("建档人");
                titles.add("手机号");
                titles.add("家长");
                titles.add("家长手机");
                titles.add("年龄");
                titles.add("班主任");
                titles.add("学校");
                titles.add("身高");
                titles.add("体重");
                titles.add("血型");
                titles.add("家庭地址");
                titles.add("爱好");
                data.setTitles(titles);
                List<List<Object>> rows = new ArrayList();
                for (int i=0;i<likepersonnel.size();i++){
                    List<Object> row1 = new ArrayList();
                    row1.add(likepersonnel.get(i).getSerialnumber());
                    row1.add(likepersonnel.get(i).getUsername());
                    row1.add(likepersonnel.get(i).getGrade());
                    row1.add(likepersonnel.get(i).getBirthday());
                    int sex = likepersonnel.get(i).getSex();
                    String se="男";
                    if (sex!=1){
                        se="女";
                    }
                    row1.add(se);
                    row1.add(likepersonnel.get(i).getInputtingperson());
                    row1.add(likepersonnel.get(i).getPhone());
                    row1.add(likepersonnel.get(i).getParrent());
                    row1.add(likepersonnel.get(i).getParrentPhone());
                    row1.add(likepersonnel.get(i).getAge());
                    row1.add(likepersonnel.get(i).getGroupManager());
                    row1.add(likepersonnel.get(i).getSchool());
                    row1.add(likepersonnel.get(i).getHint());
                    row1.add(likepersonnel.get(i).getWeight());
                    row1.add(likepersonnel.get(i).getBlood());
                    row1.add(likepersonnel.get(i).getAddress());
                    row1.add(likepersonnel.get(i).getHobby());
                    rows.add(row1);
                    data.setRows(rows);
                }
                ExcelUtils.exportExcel(response,filename,data);
 
            }
        }catch (Exception e){
            map.put("data","");
            map.put("code",400);
        }
    }

这里面我们用到了一个ExcelData实体类,是用来封装excel的。  

import java.io.Serializable;
import java.util.List;
public class ExcelData implements Serializable {
 
    private static final long serialVersionUID = 4454016249210520899L;
 
    /**
     * 表头
     */
    private List<String> titles;
 
    /**
     * 数据
     */
    private List<List<Object>> rows;
 
    /**
     * 页签名称
     */
    private String name;
 
 
    public List<String> getTitles() {
        return titles;
    }
 
    public void setTitles(List<String> titles) {
        this.titles = titles;
    }
 
    public List<List<Object>> getRows() {
        return rows;
    }
 
    public void setRows(List<List<Object>> rows) {
        this.rows = rows;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

还有ExcelUtils工具类,里面包含创建excel设置一些属性样式的方法都注释,自己看。

import com.ebatis.impl.Init;
import com.ebatis.pojo.ActionContext;
import com.ebatis.pojo.SheetInfo;
import com.zkkz.entily.Personnel;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.PaneInformation;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
 
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
 
 
//excel工具类
public class ExcelUtils {
 
   public static  List<Personnel>  readFile(String file){
 
        return null;
    }
 
 
    /**
     * 下载文件
     * @param response
     * @param fileName
     * @param data
     * @throws Exception
     */
    public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
        exportExcel(data, response.getOutputStream());
    }
 
    /**
     * 创建 表格
     * @param data
     * @param out
     * @throws Exception
     */
    public static void exportExcel(ExcelData data, OutputStream out) throws Exception {
        XSSFWorkbook wb = new XSSFWorkbook();
        try {
            String sheetName = data.getName();
            if (null == sheetName) {
                sheetName = "Sheet1";
            }
            XSSFSheet sheet = wb.createSheet(sheetName);
            writeExcel(wb, sheet, data);
            wb.write(out);
        } finally {
            wb.close();
        }
    }
 
    /**
     * 将数据写入表格
     * @param wb
     * @param sheet
     * @param data
     */
    private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
        int rowIndex = 0;
        rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
        writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
        autoSizeColumns(sheet, data.getTitles().size() + 1);
    }
 
    /**
     * 写入表头
     * @param wb
     * @param sheet
     * @param titles
     * @return
     */
    private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) {
        int rowIndex = 0;
        int colIndex = 0;
        Font titleFont = wb.createFont();//获取字体
        titleFont.setFontName("simsun");//设置字体名称(宋体)
        titleFont.setBold(true);//设置字体加粗
        titleFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色
        XSSFCellStyle titleStyle = wb.createCellStyle();//获取单元格样式
        titleStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中)
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中)
        titleStyle.setFillForegroundColor(createXssfColor("#FFFFFF"));//设置单元格前景色(白色)
        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//指定图案和纯色单元格填充的单元格填充信息(实心前景)
        titleStyle.setFont(titleFont);//设置字体样式
        setBorder(titleStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色)
        Row titleRow = sheet.createRow(rowIndex);//在该工作簿中创建第一行.
        colIndex = 0;
        for (String field : titles) {//循环创建列
            Cell cell = titleRow.createCell(colIndex);
            cell.setCellValue(field);
            cell.setCellStyle(titleStyle);
            colIndex++;
        }
        rowIndex++;//将行数++ 返回用于下面添加数据
        return rowIndex;
    }
 
    /**
     * 将数据写入
     * @param wb
     * @param sheet
     * @param rows
     * @param rowIndex
     * @return
     */
    private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) {
        int colIndex = 0;
        Font dataFont = wb.createFont();//获取字体
        dataFont.setFontName("simsun");//设置字体名称(宋体)
        dataFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色
        XSSFCellStyle dataStyle = wb.createCellStyle();//获取单元格样式
        dataStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中)
        dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中)
        dataStyle.setFont(dataFont);//设置字体样式
        setBorder(dataStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色)
        for (List<Object> rowData : rows) {//循环写入数据
            Row dataRow = sheet.createRow(rowIndex);
            colIndex = 0;
            for (Object cellData : rowData) {
                Cell cell = dataRow.createCell(colIndex);
                if (cellData != null) {
                    cell.setCellValue(cellData.toString());
                } else {
                    cell.setCellValue("");
                }
 
                cell.setCellStyle(dataStyle);
                colIndex++;
            }
            rowIndex++;
        }
        return rowIndex;
    }
 
    /**
     * 自动调整大小
     * @param sheet
     * @param columnNumber
     */
    private static void autoSizeColumns(Sheet sheet, int columnNumber) {
        for (int i = 0; i < columnNumber; i++) {
            int orgWidth = sheet.getColumnWidth(i);
            sheet.autoSizeColumn(i, true);
            int newWidth = (int) (sheet.getColumnWidth(i) + 100);
            if (newWidth > orgWidth) {
                sheet.setColumnWidth(i, newWidth);
            } else {
                sheet.setColumnWidth(i, orgWidth);
            }
        }
    }
 
    /**
     * 设置表格样式
     * @param style
     * @param border
     * @param color
     */
    private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
        style.setBorderTop(border);
        style.setBorderLeft(border);
        style.setBorderRight(border);
        style.setBorderBottom(border);
        style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color);
        style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color);
    }
 
    /**
     * 将rgb颜色码 转换为 XSSFColor
     * @param color
     * @return
     */
    private static XSSFColor createXssfColor(String color) {
        int[] rgbColor = hexToRgb(color);
        XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]));
        return xssfColor;
    }
 
    /**
     * 将颜色码 转换为 r g b
     * @param hex
     * @return
     */
    public static int[] hexToRgb(String hex) {
        String colorStr = hex;
        if (hex.startsWith("#")) {
            colorStr = hex.substring(1);
        }
        if (StringUtils.length(colorStr) == 8) {
            colorStr = hex.substring(2);
        }
        int  r=  Integer.valueOf( colorStr.substring( 0, 2 ), 16 );
        int  g=  Integer.valueOf( colorStr.substring( 2, 4 ), 16 );
        int  b=  Integer.valueOf( colorStr.substring( 4, 6 ), 16 );
 
        return new int[] { r, g, b };
    }
 
 
 
    /**
     * Description: 将对象集合写入到excel中 eq:对象的属性应和excel的header对应 <BR>
     *
     * @author dsn
     * @date 2017年9月15日 下午3:55:57
     * @return
     * @version 1.0
     */
    public static boolean exportExcel(List<Personnel> personnels, String fileName, HttpServletResponse response) throws FileNotFoundException, UnsupportedEncodingException {
        // 告诉浏览器用什么软件可以打开此文件
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 下载文件的默认名称
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
        HSSFWorkbook mWorkbook = new HSSFWorkbook();
 
        HSSFSheet mSheet = mWorkbook.createSheet("数据");
 
        // 创建Excel标题行,第一行。
        HSSFRow headRow = mSheet.createRow(0);
        headRow.createCell(0).setCellValue("学号");
        headRow.createCell(1).setCellValue("姓名");
        headRow.createCell(2).setCellValue("班级");
        headRow.createCell(3).setCellValue("出生年月");
        headRow.createCell(4).setCellValue("性别");
        headRow.createCell(5).setCellValue("建档人");
        headRow.createCell(6).setCellValue("手机号");
        headRow.createCell(7).setCellValue("家长");
        headRow.createCell(8).setCellValue("家长手机");
        headRow.createCell(9).setCellValue("年龄");
        headRow.createCell(10).setCellValue("班主任");
        headRow.createCell(11).setCellValue("学校");
        headRow.createCell(12).setCellValue("身高");
        headRow.createCell(13).setCellValue("体重");
        headRow.createCell(14).setCellValue("血型");
        headRow.createCell(15).setCellValue("家庭地址");
        headRow.createCell(16).setCellValue("爱好");
 
        // 往Excel表中写入3行测试数据。
        for (int i=0;i<personnels.size();i++){
            createCell(personnels.get(i), mSheet);
        }
 
//        File xlsFile = new File(path);
//        mWorkbook.write(xlsFile);// 或者以流的形式写入文件 mWorkbook.write(new FileOutputStream(xlsFile));
        try {
            mWorkbook.write(response.getOutputStream());
//            mWorkbook.write(xlsFile);
            mWorkbook.close();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
 
    // 创建Excel的一行数据。
    private static void createCell(Personnel personnel,HSSFSheet sheet) {
        HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
 
        dataRow.createCell(0).setCellValue(personnel.getSerialnumber());
        dataRow.createCell(1).setCellValue(personnel.getUsername());
        dataRow.createCell(2).setCellValue(personnel.getGrade());
        dataRow.createCell(3).setCellValue(personnel.getBirthday());
        int sex = personnel.getSex();
        String se="男";
        if (sex!=1){
            se="女";
        }
        dataRow.createCell(4).setCellValue(se);
        dataRow.createCell(5).setCellValue(personnel.getInputtingperson());
        dataRow.createCell(6).setCellValue(personnel.getPhone());
        dataRow.createCell(7).setCellValue(personnel.getParrent());
        dataRow.createCell(8).setCellValue(personnel.getParrentPhone());
        dataRow.createCell(9).setCellValue(personnel.getAge());
        dataRow.createCell(10).setCellValue(personnel.getGroupManager());
        dataRow.createCell(11).setCellValue(personnel.getSchool());
        dataRow.createCell(12).setCellValue(personnel.getHint());
        dataRow.createCell(13).setCellValue(personnel.getWeight());
        dataRow.createCell(14).setCellValue(personnel.getBlood());
        dataRow.createCell(15).setCellValue(personnel.getAddress());
        dataRow.createCell(16).setCellValue(personnel.getHobby());
 
 
    }
 
 
    /**
     * Description:将excel读入到对象集合中 <BR>
     *
     * @author dsn
     * @date 2017年9月15日 下午3:56:53
     * @param file
     * @param sheetIndex
     * @return
     * @version 1.0
     */
    public static List<List<Object>> importExcel2Collection(File file, int sheetIndex) {
        List<List<Object>> list = new LinkedList<List<Object>>();
        Object value = null;
        int counter = 0;
 
        Workbook wb = null;
 
        try {
            wb = new HSSFWorkbook(new FileInputStream(file));
        } catch (OfficeXmlFileException e) {
            try {
                wb = new XSSFWorkbook(new FileInputStream(file));
            } catch (IOException e1) {
                System.out.println("excel读入到对象异常,不支持的excel类型!,"+e);
                return null;
            }
        } catch (Exception e) {
            System.out.println("excel读入到对象异常,不支持的excel类型!,"+e);
            return null;
        }
 
        Sheet sheet = wb.getSheetAt(sheetIndex);
        if (sheet == null)
            return null;
        Row row;
        Cell cell;
 
        for (int i = sheet.getFirstRowNum(); counter < sheet.getPhysicalNumberOfRows(); i++) {
            row = sheet.getRow(i);
            if (row == null)
                continue;
            else
                counter++;
 
            List<Object> linked = new LinkedList<Object>();
            for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
                cell = row.getCell(j);
                if (cell == null) {
                    value = "";
                    linked.add(value);
                    continue;
                }
                DecimalFormat df = new DecimalFormat("0");// 格式化 number String
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 格式化日期字符串
                DecimalFormat nf = new DecimalFormat("0");// 格式化数字
                switch (cell.getCellType()) {
                    case XSSFCell.CELL_TYPE_STRING:
                        value = cell.getStringCellValue();
                        break;
                    case XSSFCell.CELL_TYPE_NUMERIC:
                        if ("@".equals(cell.getCellStyle().getDataFormatString())) {
                            value = df.format(cell.getNumericCellValue());
                        } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                            value = nf.format(cell.getNumericCellValue());
                        } else {
                            value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                        }
                        break;
                    case XSSFCell.CELL_TYPE_BOOLEAN:
                        value = cell.getBooleanCellValue();
                        break;
                    case XSSFCell.CELL_TYPE_BLANK:
                        value = "";
                        break;
                    default:
                        value = cell.toString();
                }
                linked.add(value);
            }
            list.add(linked);
        }
        return list;
    }
 
 
 
   
}

调用下载方法会用XSSFWorkbook类的write方法把文件流传到前端。

wb.write(out);

out就是response.getOutputStream() 。

excel的导入导出功能已经完成,工具类可以拿过去使用,注意添加jar依赖。

        <!--文件读取-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

注意两个包的版本要一致。  

  

  

  

  

  

原文地址:https://www.cnblogs.com/dsn727455218/p/12793969.html