Java通过Poi的开发Excel导入导出和下载功能

December 17, 2023
测试
测试
测试
测试
73 分钟阅读

最近有用到Excel的下载、导入、导出功能。提供一个Excel模板给用户下载,用户根据规范填写模板然后再导入Excel数据,保存到数据库,也可导出类表数据为Excel。因为有时候页面添加功太麻烦,就做成这样的Excel批量导入。

154466968004240052054.png
154466968004240052054.png
154466968512245091885.png
154466968512245091885.png

Excel的下载

这项目用的是spring+Struts2+mybatis。

需要的jar包

<!-- POI-EXCEL -->
<dependency>
  <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
  <version>3.9</version>
</dependency>

 <!-- POI-EXCEL 这个包使用下面的最新ExcelUtil-->
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.15</version>
	</dependency>

有两种方式

第一种、把Excel模板放在项目目录,提供下载。(这种比较方便)

Excel的路径:webapp/common/excelModule/downloadModel.xlsx。

前台代码:

<form action="" name="Form" id="myForm" method="" enctype="multipart/form-data">
    <div id="zhongxin">
	<table style="width:95%;" >
           <tr>
	      <td style="padding-top: 20px;"><input type="file" id="excel"/></td>
	  </tr>
	  <tr>
	     <td style="text-align: center;padding-top: 10px;">
		<a class="btn btn-mini btn-primary" id="submitBtn">导入</a>
		<a class="btn btn-mini btn-success" id="downLoadExcel">下载模版</a>
	     </td>
	   </tr>
      </table>
  </div>
  <div id="zhongxin2"class="center" style="display:none"><br/><img src="images/jzx.gif"/>
  <br/><h4 class="lighter block green"></h4></div> 
</form>

js代码:

$('#downLoadExcel').click(function(){
	location.href ='downLoadModel.action'; 
});

action代码:

    /**
     * 下载文件的文件名和流
     */
    private String fileName;
    private InputStream is;
    
   略:get set方法。
    
    /**
     * 下载模板
     * 
     * @throws Exception
     */
    public String downLoadModel() throws Exception {

        // 为InputStream的is流参数赋值
        is = ServletActionContext.getServletContext()
        .getResourceAsStream("/common/excelModule/downloadModel.xlsx");
        fileName = new String("题目导入模板.xlsx".getBytes(), "ISO8859-1");

        return "success";
    }

Struts2配置文件:

<action name="*Question" class="com.bayan.keke.action.QuestionAction"
	method="{1}">
	<result name="toList">/WEB-INF/jsp/question/questionList.jsp</result>
	<result name="success" type="stream">
		<param name="contentType">application/vnd.ms-excel</param>
		<param name="contentDisposition">attachment;fileName=${fileName}</param>
		<param name="inputName">is</param>
		<param name ="bufferSize">4096</param>  
	</result>
</action>

好了,一个简单的下载功能就完成了。

注意:Struts的配置文件中的文件名和流要和action的对应。

第二种、自定义生成Excel模板,提供下载。(ExcelUtil工具类代码在底下)

/**
     * 下载模板
     * 
     * @throws Exception
     */
    public void downExcel() throws Exception {

        try {
            String[] titles =
                new String[] {"比赛名称", "报名者姓名", "报名者手机号", 
                "报名者身份证号", "性别", "邮箱", "住址", "职业", "分数"};
            String[] cols =
                new String[] {"partyName", "userName", "userPhone",
                 "userIdCard", "sex", "email",
                    "address", "career", "score"};
          List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
         ExcelUtil.outPutExcelByMap(list, titles, cols, "题目信息模板",
          getRequest(), getResponse());
            renderNull();
        } catch (Exception e) {
            e.printStackTrace();
        }
        toList();

    }

Excel的导入

js代码:通过ajax,formdata格式提交文件

//导入Excel
		$("#importExcel").click(function(){
			$('#importQuestion').modal('show'); 
		});
		
		$("#submitBtn").click(function(){
			var fileName = $("#excel").val();
	        var suffix = (fileName.substr(fileName.lastIndexOf("."))).toUpperCase();
			
			//验证文件后缀名
			if(".XLS" != suffix && ".XLSX" != suffix ){
				alert("文件格式只能是.XLS或者.XLSL");
				return false;
			}
			var formData = new FormData();
			var file = $("#excel")[0].files[0];
			if (file != "") {
				formData.append("excel", file);
            }
			  $.ajax({
	                type : "POST",
	                url : "importExcel.action",
	                data : formData,
	                cache : false,
	                processData : false,
	                contentType : false,
	                dataType:'json',  
	                success : function(data) {
	                	if (data.result == "success") {
	                		alert("导入题目成功");
	                		
	    	                $('#importQuestion').modal('hide');
	    	                getQuestionList();
	    	            }else if(data.result == "fileNull"){
	    	                alert("导入的文件为空");
	    	            }else if(data.result == "excelNull"){
	    	                alert("导入的Excel表格内容为空");
	    	            }else if(data.result == "maxLength"){
	    	                alert("导入的Excel表格内容超过了最大1000");
	    	            } else if(data.result == "fail"){
	    	            	alert("导入数据库失败");
	    	            }else if(data.result=="error"){
	                		alert(data.codeError);
	                	}else{
	    	            	alert("导入失败");
	    	            }
	                	
	                }
	            });
			//$("#myForm").submit();
		
		});

action代码:

/**
     * 导入Excel
     * 
     * @throws Exception
     */
    @SuppressWarnings("unused")
    public void importExcel() throws Exception {
        printStartLog("方法开始update", LOGGER);
        // 将客户端的文件上传到服务端
        String desPath = ServletActionContext.getServletContext()
                .getRealPath("/upload/questionModel");
        File destFile = new File(excelFileName);
        // 上传到本地
        FileUtils.copyFile(excel, destFile);

        JSONObject json = new JSONObject();
        if (destFile == null) {
            printDebugLog("导入的文件为空", LOGGER);
            json.element("result", "fileNull");
            print(json);
            return;
        }
        // 解析excel
        List<String[]> excelList = ExcelUtil.getExcelData(excel, 1);

        if (excelList.size() > 1000) {
            printDebugLog("导入的Excel表格内容超过了最大1000", LOGGER);
            json.element("result", "maxLength");
            print(json);
            return;
        }

        String lengthMsg = "", formatMsg = "", emptyMsg = "";
        int n = 2;
        // 格式校验
        for (String[] data : excelList) {
            if (data.length > 17 || Tools.isEmpty(data)) {
                formatMsg += "第" + n + "行数据为空或者超出列数、";
            }
            if (data[0].length() > 20) {
                lengthMsg += "第" + n + "行题目编号、";
            }
            if (Tools.isEmpty(data[1])) {
                emptyMsg += "第" + n + "行题目标题、";
            } else if (data[1].length() > 1000) {
                lengthMsg += "第" + n + "行题目标题、";
            }
            if (Tools.isEmpty(data[3])) {
                emptyMsg += "第" + n + "行有无题目附件、";
            } else if (!"0".equals(data[3]) && !"1".equals(data[3])) {
                formatMsg += "第" + n + "行有无题目附件只能填0或1、";
            } else if ("1".equals(data[3]) && Tools.isEmpty(data[4])) {
                formatMsg += "第" + n + "题目附件名必填、";
            } else if ("0".equals(data[3]) && Tools.isNotEmpty(data[4])) {
                formatMsg += "第" + n + "题目附件名不必填、";
            }
            if (Tools.isNotEmpty(data[4]) && data[4].length() > 255) {
                lengthMsg += "第" + n + "行题目附件名、";
            }
            if (Tools.isNotEmpty(data[5]) && data[5].length() > 200) {
                lengthMsg += "第" + n + "行题目标签、";
            }
            if (Tools.isEmpty(data[6])) {
                emptyMsg += "第" + n + "行所属学科、";
            } else if (!getCodeList(KeConstant.QUESTION_SUBJECT_TYPE_OWNID)
                                           .contains(data[6])) {
                formatMsg += "第" + n + "行所属学科值不在范围内、";
            }
            if (Tools.isEmpty(data[7])) {
                emptyMsg += "第" + n + "行题型类别、";
            } else if (!getCodeList(KeConstant.QUESTION_TYPE_OWNID).contains(data[7])) {
                formatMsg += "第" + n + "行题型类别值不在范围内、";
            }
           
            
            System.out.println(data[0] + "---" + data[1] + "---" + data[2]+
             "---" + data[3] + "---" + data[4] + "---"
                + data[5] + "---" + data[6] + "---" + data[7]);
            n++;
        }
        if (!"".equals(lengthMsg) || !"".equals(formatMsg) || !"".equals(emptyMsg)) {
            json.element("result", "error");
            json.element("codeError", assembleErrorMsg(formatMsg,emptyMsg,lengthMsg));
            print(json);
            return;
        }
        // 存入数据库操作======================================//
        // 新增列表
        boolean result = save(excelList);
        if (result) {
            json.element("result", "success");
            print(json);
        } else {
            json.element("result", "fail");
            print(json);
        }

        // 请求结束log
        printEndLog("更新学生结束返回值:", json.toString(), LOGGER);
    }

    private Boolean save(List<String[]> excelList) throws Exception {
        List<KeQuestion> saveQuestionList = new ArrayList<KeQuestion>();
        Date now = new Date();
        for (String[] data : excelList) {
            KeQuestion saveQuestion = new KeQuestion();
            saveQuestion.setId(Tools.getUniqueId());
            saveQuestion.setTitle(data[1]);
            saveQuestion.setIndex(data[0]);
            saveQuestion.setContent(data[2]);
            saveQuestion.setHasAnnex(Integer.parseInt(data[3]) == 0?false:true);
            saveQuestion.setResourceUrl(data[4]);
            saveQuestion.setSpan(data[5]);
           ......
         
        }
        boolean result = true;
        result = questionService.insertQuestion(saveQuestionList);
        return result;
    }
    private String assembleErrorMsg(String formatMsg,String emptyMsg,String length) {
        String tabf = !"".equals(formatMsg)||!"".equals(emptyMsg)?"---": "";
     String promptMsg="长度超过规定范围。" + tabf : "";
        String tabs = !"".equals(emptyMsg) ? "---" : "";
        promptMsg += !"".equals(formatMsg) ? formatMsg.substring(0, formatMsg.length()
         - 1) + "格式错误。" + tabs : "";
        promptMsg += !"".equals(emptyMsg) ? emptyMsg.substring(0, emptyMsg.length() 
        - 1) + "为空,无法导入。" : "";
        return promptMsg;
    }

注意:Excel的验证根据自己的需求来判断,验证无误的在通过对象保存到数据库中。Excel单元格通通为文本格式,不然有问题

遇到过的问题:当Excel最后一列为空时,比如一空有10列,但最后一列为空时拿到了ExcelList长度为9,,折腾了半天无果,就改为了通过第一行标题来获取列长度,这样就没问题了。注意数据还是从第二行开始获取。还有一个问题就是,当填的值为0等数字时,取到则为0.0,设置了Excel的单元格为文本格式还是没用,需要设置为强文本格式(选择单元格点导航栏数据中的分列,然后下一步,下一步,选择文本,完成即可)。

然后还有就是一定要效验好数据,不能漏了各种会出现的情况,不然保存到数据库出问题就大条了。

Excel的导出

java代码:

 /**
     * 导出表格信息为Excel
     * 
     * @throws Exception
     */
    public void excelExport() throws Exception {

        try {
            String[] titles = new String[] {"比赛名称", "报名人姓名", 
                    "报名人手机号", "身份证号", "报名时间", "分数"};
            String[] cols =
                new String[] {"partyName", "userName", "userPhone",
                     "userIdCard", "creationTime","score"};
                    
            // 查询比赛信息
            ExaminationPartyInfo keywords = new ExaminationPartyInfo();
            keywords.setIsDeleted(Const.ISDELETED_FALSE).setType(Const.PARTYTYPE_BS);
            if (Tools.isNotEmpty(Jurisdiction.getMerchanismId())) {
                keywords.setMerchanismId(Jurisdiction.getMerchanismId());
            }
     List<ExaminationPartyInfo>partyList =examinationPartyInfoService.findList(keywords);
            // 查询报名信息
            ExaminationRegisterInfo condition = new ExaminationRegisterInfo();
            condition.setPartyIdArray(Tools.array2Long(StringUtil
                .listToString(partyList, "partyId")));
            List<ExaminationRegisterInfo> registerList =
                examinationRegisterInfoService.findList(condition);

            Map<String, Object> partyMap = Tools.list2Map(partyList, "partyId", "name");
            Map<String, Object> userNameMap = new HashMap<String, Object>(16);
            Map<String, Object> userPhoneMap = new HashMap<String, Object>(16);
           Map<String, Object> userIdCardMap = new HashMap<String, Object>(16);
            if (registerList.size() > 0) {
                List<ExaminationUserInfo> userInfoList =
                   examinationUserInfoService.findByIdAsGroup(Tools.array2Long(StringUtil
                        .listToString(registerList, "userId")));
                if (userInfoList.size() > 0) {
                    userInfoList.stream().forEach(e -> {
                        userNameMap.put(String.valueOf(e.getUserId()), e.getName());
                        userPhoneMap.put(String.valueOf(e.getUserId()), e.getPhone());
                        userIdCardMap.put(String.valueOf(e.getUserId()), e.getIdCard());
                    });
                }
                registerList.stream().forEach(e -> {
                    e.put("partyName", partyMap.get(e.getPartyId()));
                    e.put("userName", userNameMap.get(e.getUserId()));
                    e.put("userPhone", userPhoneMap.get(e.getUserId()));
                    e.put("userIdCard", userIdCardMap.get(e.getUserId()));
                });
                ExaminationGradeInfo examinationGradeInfo =
                    getBean(ExaminationGradeInfo.class, "", true);
                examinationGradeInfo.setRegisterIdArray(Tools.array2Long(StringUtil.listToString(
                    registerList, "registerId")));
                examinationGradeInfo.setIsDeleted(Const.ISDELETED_FALSE);
                Page<ExaminationGradeInfo> examinationGradeInfoPage =
                    examinationGradeInfoService.findListInPageWithKeywords(
                        getParaToInt("pageNumber"), getParaToInt("pageSize"), examinationGradeInfo,
                        getPara("sortName"), getPara("sortOrder"));

                Map<String, Object> registerInfoMap = Tools.list2Map(registerList, "registerId");
                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                examinationGradeInfoPage.getList().forEach(
                    e -> {
                        Map<String, Object> map = new HashMap<String, Object>(16);
                        ExaminationRegisterInfo registerInfo =
                            (ExaminationRegisterInfo)registerInfoMap.get(e.getRegisterId());
                        if (registerInfo != null) {
                            map.put("userName", registerInfo.get("userName"));
                            map.put("userPhone", registerInfo.get("userPhone"));
                            map.put("userIdCard", registerInfo.get("userIdCard"));
                            map.put("partyName", registerInfo.get("partyName"));
                            map.put("creationTime", registerInfo.getCreationTime());
                        }
                        map.put("score", e.getScore());
                        list.add(map);
                    });

                ExcelUtil.outPutExcelByMap(list, titles, cols, "报名信息" + Tools.getUniqueId(),
                    getRequest(), getResponse());
            }
            renderNull();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

ExcelUtil 工具类:

 package com.egaosoft.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

/**
 * 使用poi报表导出工具类 把poi的一个调用接口抽出来,便于导出功能的管理
 */

public class ExcelUtil {

    /**
     * 导出list中map做载体的数据到excel 参数说明: list:存放了Map数据的集合 hdNames:表头列名 hds:对应表头的数据KEY xlsName:导出文件名
     */
    public static <T> boolean outPutExcelByMap(List<Map<String, Object>> list, String[] hdNames, String[] hds,
        String xlsName, HttpServletRequest request, HttpServletResponse response) throws Exception {

        Workbook wb = new HSSFWorkbook(); // 创建工作薄
        Sheet sheet = wb.createSheet(); // 创建工作表
        sheet.autoSizeColumn((short)0); // 自适应宽度
        // 写入表头---Excel的第一行数据
        Row nRow = sheet.createRow(0); // 创建行
        for (int i = 0; i < hdNames.length; i++) {
            Cell nCell = nRow.createCell(i); // 创建单元格
            nCell.setCellValue(hdNames[i]);
        }

        // 写入每一行数据---一条记录就是一行数据
        for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < hds.length; j++) {
                Object o = list.get(i).get(hds[j]); // 得到列的值
                data2Excel(sheet, o, i + 1, j); // 将值写入Excel
            }
        }
        setSizeColumn(sheet, hdNames.length);
        return downloadExcel(wb, xlsName, request, response);
    }

    /**
     * 传递一个Wookbook,给定文件名,以及request和response下载Excel文档
     * 
     * @throws IOException
     */
    @SuppressWarnings("all")
    private static boolean downloadExcel(Workbook wb, String xlsName, HttpServletRequest request,
        HttpServletResponse response) throws IOException {
        if (request.getHeader("user-agent").indexOf("MSIE") != -1) {
            xlsName = java.net.URLEncoder.encode(xlsName, "utf-8") + ".xls";
        } else {
            xlsName = new String(xlsName.getBytes("utf-8"), "iso-8859-1") + ".xls";
        }
        OutputStream os = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=" + xlsName);

        wb.write(os);
        return true;
    }

    /**
     * 将数据写到Excel中
     */
    private static void data2Excel(Sheet sheet, Object o, Integer r, Integer c) {
        // 通过获得sheet中的某一列,有得到,没有创建
        Row nRow = sheet.getRow(r);
        if (nRow == null) {
            nRow = sheet.createRow(r);
        }
        // nRow.setColumnWidth(r, arg1);

        Cell nCell = nRow.createCell(c);

        // 根据不同类型进行转化,如有其它类型没有考虑周全的,使用发现的时候添加
        char type = 'x';
        if (o instanceof Integer) {
            type = 1;
        } else if (o instanceof Double) {
            type = 2;
        } else if (o instanceof Float) {
            type = 3;
        } else if (o instanceof String) {
            type = 4;
        } else if (o instanceof Date) {
            type = 5;
        } else if (o instanceof Calendar) {
            type = 6;
        } else if (o instanceof Boolean) {
            type = 7;
        } else if (o == null) {
            type = 8;
        }

        switch (type) {
            case 1:
                nCell.setCellValue((Integer)o);
                break;
            case 2:
                nCell.setCellValue((Double)o);
                break;
            case 3:
                nCell.setCellValue((Float)o);
                break;
            case 4:
                nCell.setCellValue((String)o);
                break;
            case 5:
                nCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(o));
                break;
            case 6:
                nCell.setCellValue((Calendar)o);
                break;
            case 7:
                nCell.setCellValue((Boolean)o);
                break;
            case 8:
                nCell.setCellValue("");
                break;
            default:
                nCell.setCellValue(o + "");
                break;
        }
    }

    public static List<String[]> getExcelData(File file) {
        return getData(file, 0).get(0);// 选择sheet1
    }

    public static List<String[]> getExcelData(File file, int rowStart) {
        return getData(file, rowStart).get(0);// 选择sheet1
    }

    @SuppressWarnings("deprecation")
    public static List<List<String[]>> getData(File file, int rowStart) {
        Workbook workbook;
        List<List<String[]>> data = new ArrayList<List<String[]>>();
        try {
            workbook = WorkbookFactory.create(new FileInputStream(file));
            Sheet sheet = null;
            // 循环sheet
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                sheet = workbook.getSheetAt(i);
                List<String[]> rows = new ArrayList<String[]>();
                int colsnum = 0;
                // 循环每一行
                for (int j = rowStart; j <= sheet.getLastRowNum(); j++) {
                    Row row = sheet.getRow(j);
                    if (null != row) {
                        // 列数以excel标题为准
                        colsnum = sheet.getRow(0).getLastCellNum();
                        String[] cols = new String[colsnum];
                        // 循环每一个单元格,以一行为单位,组成一个数组
                        for (int k = 0; k < colsnum; k++) {
                            // 判断单元格是否为null,若为null,则置空
                            if (null != row.getCell(k)) {
                                int type = row.getCell(k).getCellType();
                                // 判断单元格数据是否为数字
                                if (type == HSSFCell.CELL_TYPE_NUMERIC) {
                                    // 判断该数字的计数方法是否为科学计数法,若是,则转化为普通计数法
                                    if (String.valueOf(row.getCell(k).getNumericCellValue()).matches(".*[E|e].*")) {
                                        DecimalFormat df = new DecimalFormat("#.#");
                                        // 指定最长的小数点位为10
                                        df.setMaximumFractionDigits(10);
                                        cols[k] = df.format(row.getCell(k).getNumericCellValue());
                                        // 判断该数字是否是日期,若是则转成字符串
                                    } else if (HSSFDateUtil.isCellDateFormatted(row.getCell(k))) {
                                        Date d = row.getCell(k).getDateCellValue();
                                        DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                                        cols[k] = formater.format(d);
                                    } else {
                                        BigDecimal number =
                                            BigDecimal.valueOf(Double.valueOf(row.getCell(k).toString()));
                                        if (number.compareTo(number.setScale(0)) == 0) {
                                            cols[k] = number.setScale(0).toString();
                                            continue;
                                        }
                                        cols[k] = (row.getCell(k) + "").trim();
                                    }
                                } else {
                                    cols[k] = (row.getCell(k) + "").trim();
                                }
                            } else {
                                cols[k] = "";
                            }
                        }
                        // 去除全是空值得行
                        int num = 0;
                        for (String col : cols) {
                            if (Tools.isEmpty(col)) {
                                num++;
                            }
                        }
                        if (num != cols.length) {
                            // 以一行为单位,加入list
                            rows.add(cols);
                        }

                    }
                }
                // 返回所有数据,第一个list表示sheet,第二个list表示sheet内所有行数据,第三个string[]表示单元格数据
                data.add(rows);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
        return data;
    }

    @SuppressWarnings("deprecation")
    private static void setSizeColumn(Sheet sheet, int size) {
        for (int columnNum = 0; columnNum < size; columnNum++) {
            sheet.autoSizeColumn((short)columnNum);
            int columnWidth = sheet.getColumnWidth(columnNum) / 256;
            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                Row currentRow;
                // 当前行未被使用过
                if (sheet.getRow(rowNum) == null) {
                    currentRow = sheet.createRow(rowNum);
                } else {
                    currentRow = sheet.getRow(rowNum);
                }

                if (currentRow.getCell(columnNum) != null) {
                    Cell currentCell = currentRow.getCell(columnNum);
                    if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        int length = currentCell.getStringCellValue().getBytes().length;
                        if (columnWidth < length) {
                            columnWidth = length;
                        }
                    }
                }
            }
            sheet.setColumnWidth(columnNum, 256 * columnWidth + 184);
        }
    }

}

SSM框架下导入导出

导出:

/**
 * 导出题目
 */
@RequestMapping(value="excelExport")
@ResponseBody
public ModelAndView excelExport(){
    logBefore(logger, Jurisdiction.getUsername() + "导出信息");
    ModelAndView mv = this.getModelAndView();
    PageData pd = this.getPageData();
    String keywords = pd.getString("keywords"); // 检索条件 关键词
    if (null != keywords && !"".equals(keywords)) {
        pd.put("keywords", keywords.trim());
    }
    try {
        PageData bPd = new PageData();
        bPd.put("tableName", "aicp_question");
        bPd.put("columnName", "type");
        Map<String, String> basicMap = Tools.list2Map(basicVariableService.listAll(bPd), "value", "title");
        Map<String, Object> dataMap = new HashMap<String, Object>();
        List<String> titles = new ArrayList<String>();
        titles.add("题目");
        titles.add("类型");
        titles.add("答案");
        titles.add("解析");
        titles.add("选项");
        dataMap.put("titles", titles);
        List<PageData> listData = aicpQuestionService.listAll(pd);
        List<PageData> varList = new ArrayList<PageData>();
        listData.stream().forEach(e ->{
            PageData vpd = new PageData();
            vpd.put("var1", e.getString("question"));
            vpd.put("var2", basicMap.get(e.getString("type")));
            vpd.put("var3", e.getString("answer"));
            vpd.put("var4", e.getString("parsing"));
            vpd.put("var5", e.getString("option"));
            varList.add(vpd);
        });
        dataMap.put("varList", varList);
        ObjectExcelView erv = new ObjectExcelView();
        mv = new ModelAndView(erv, dataMap);
    } catch (Exception e) {
        logger.error(e.toString(), e);
    }
    return mv;
}

导入和下载模板:

@RequestMapping(value = "/downExcel")
public void downExcel(HttpServletResponse response) throws Exception {
    FileDownload.fileDownload(response, PathUtil.getClasspath() + Const.FILEPATHFILE + "2020102120125.xls",
            "2020102120125.xls");
}

@RequestMapping(value = "/readExcel")
public ModelAndView readExcel(@RequestParam(value = "excel", required = false) MultipartFile file, @RequestParam(value = "warehouseId", required = false)String warehouseId)
        throws Exception {
    logBefore(logger, Jurisdiction.getUsername() + ":从EXCEL导入题目。");
    ModelAndView mv = this.getModelAndView();
    if (!this.hasAddQX(this.menuId)) {
        logAfter(logger, Jurisdiction.getUsername() + ":无权从EXCEL导入题目");
    } else {
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            if (null != file && !file.isEmpty()) {
                String filePath = PathUtil.getClasspath() + Const.FILEPATHFILE;
                String fileName = FileUpload.fileUp(file, filePath, "userexcel");
                List<PageData> listPd = (List)ObjectExcelRead.readExcel(filePath, fileName, 2, 0, 0);

                String date = Tools.date2Str(new Date());
                List<PageData> saveList = new ArrayList<PageData>();
                for (PageData pd : listPd) {
                    PageData cd = new PageData();
                    cd.put("id", getUniqueId());
                    cd.put("warehouseId", warehouseId);
                    cd.put("question", pd.get("var0"));
                    cd.put("option", pd.get("var4"));
                    cd.put("answer", pd.get("var2"));
                    cd.put("parsing", pd.get("var3"));
                    if(pd.getString("var1").equals("单选")){
                        cd.put("type", "0");
                    }else if(pd.getString("var1").equals("多选")){
                        cd.put("type", "1");
                    }else if(pd.getString("var1").equals("填空")){
                        cd.put("type", "2");
                    }else if(pd.getString("var1").equals("判断")){
                        cd.put("type", "3");
                    }
                    cd.put("createTime", new Date());
                    cd.put("modifiedTime", new Date());
                    cd.put("isDeleted", "0");
                    saveList.add(cd);
                }
                mv.addObject("data", JSONObject.fromObject(aicpQuestionService.insertMultiple(saveList)));
            }
        } catch (Exception e) {
            e.printStackTrace();
            mv.addObject("data",
                    JSONObject.fromObject(Tools.fillMap(map, false, Const.TYPE_ALERT, "导入失败!请及时联系管理员解决问题,以免发生后续错误。")));
        }

    }
    mv.setViewName("save_result");
    return mv;
}

ObjectExcelRead工具类

package com.fh.util;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


/**
 * 从EXCEL导入到数据库
 * 创建人:FH Q313596790
 * 创建时间:2014年12月23日
 * @version
 */
public class ObjectExcelRead {

   /**
    * @param filepath //文件路径
    * @param filename //文件名
    * @param startrow //开始行号
    * @param startcol //开始列号
    * @param sheetnum //sheet
    * @return list
    */
   @SuppressWarnings({ "deprecation", "resource" })
   public static List<Object> readExcel(String filepath, String filename, int startrow, int startcol, int sheetnum) {
      List<Object> varList = new ArrayList<Object>();

      try {
         File target = new File(filepath, filename);
         FileInputStream fi = new FileInputStream(target);
         HSSFWorkbook wb = new HSSFWorkbook(fi);
         HSSFSheet sheet = wb.getSheetAt(sheetnum);                 //sheet 从0开始
         int rowNum = sheet.getLastRowNum() + 1;                //取得最后一行的行号

         for (int i = startrow; i < rowNum; i++) {              //行循环开始
            
            PageData varpd = new PageData();
            HSSFRow row = sheet.getRow(i);                       //行
            int cellNum = row.getLastCellNum();                //每行的最后一个单元格位置

            for (int j = startcol; j < cellNum; j++) {          //列循环开始
               
               HSSFCell cell = row.getCell(Short.parseShort(j + ""));
               String cellValue = null;
               if (null != cell) {
                  switch (cell.getCellType()) {              // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
                  case 0:
                     cellValue = String.valueOf((int) cell.getNumericCellValue());
                     break;
                  case 1:
                     cellValue = cell.getStringCellValue();
                     break;
                  case 2:
                     cellValue = cell.getNumericCellValue() + "";
                     // cellValue = String.valueOf(cell.getDateCellValue());
                     break;
                  case 3:
                     cellValue = "";
                     break;
                  case 4:
                     cellValue = String.valueOf(cell.getBooleanCellValue());
                     break;
                  case 5:
                     cellValue = String.valueOf(cell.getErrorCellValue());
                     break;
                  }
               } else {
                  cellValue = "";
               }
               
               varpd.put("var"+j, cellValue);
               
            }
            varList.add(varpd);
         }

      } catch (Exception e) {
         System.out.println(e);
      }
      
      return varList;
   }
}

ObjectExcelView工具类

package com.fh.util;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
/**
* 导入到EXCEL
* 类名称:ObjectExcelView.java
* @author FH Q313596790
* @version 1.0
 */
@SuppressWarnings({"deprecation", "unchecked"})
public class ObjectExcelView extends AbstractExcelView{

   @Override
   protected void buildExcelDocument(Map<String, Object> model,
         HSSFWorkbook workbook, HttpServletRequest request,
         HttpServletResponse response) throws Exception {
      // TODO Auto-generated method stub
      Date date = new Date();
      String filename = Tools.date2Str(date, "yyyyMMddHHmmss");
      HSSFSheet sheet;
      HSSFCell cell;
      response.setContentType("application/octet-stream");
      response.setHeader("Content-Disposition", "attachment;filename="+filename+".xls");
      sheet = workbook.createSheet("sheet1");
      
      List<String> titles = (List<String>) model.get("titles");
      int len = titles.size();
      HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
      headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
      HSSFFont headerFont = workbook.createFont();   //标题字体
      headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
      headerFont.setFontHeightInPoints((short)11);
      headerStyle.setFont(headerFont);
      short width = 20,height=25*20;
      sheet.setDefaultColumnWidth(width);
      for(int i=0; i<len; i++){ //设置标题
         String title = titles.get(i);
         cell = getCell(sheet, 0, i);
         cell.setCellStyle(headerStyle);
         setText(cell,title);
      }
      sheet.getRow(0).setHeight(height);
      
      HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式
      contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      List<PageData> varList = (List<PageData>) model.get("varList");
      int varCount = varList.size();
      for(int i=0; i<varCount; i++){
         PageData vpd = varList.get(i);
         for(int j=0;j<len;j++){
            String varstr = vpd.getString("var"+(j+1)) != null ? vpd.getString("var"+(j+1)) : "";
            cell = getCell(sheet, i+1, j);
            cell.setCellStyle(contentStyle);
            setText(cell,varstr);
         }
         
      }
      
   }

}

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多