zoukankan      html  css  js  c++  java
  • 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>
    

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

      

      

      

      

      

  • 相关阅读:
    [转载-声网]18个实时音视频开发中会用到开源项目
    linux shell命令之wc/split及特殊字符
    RTP推流及验证
    Ubuntu18.04提示wifi无法连接
    ubuntu上Android开发环境及依赖项
    HLS playlist典型示例
    ffmpeg-hls实现分析
    AOSP中的HLS协议解析
    使用ffmpeg搭建HLS直播系统
    流媒体之HLS——综述(二)
  • 原文地址:https://www.cnblogs.com/dsn727455218/p/12793969.html
Copyright © 2011-2022 走看看