POI_Excel表格数据导入导出实例--支持xls/xlsx格式

本文详细介绍使用Java实现Excel数据的导入与导出过程。包括处理xlsx和xls格式,利用POI库读取数据并导入数据库,以及从数据库中提取数据生成Excel文件。涉及文件上传、数据验证和错误处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Excel导入数据库实例

注意:xlsx格式需导入xmlbeans包,否则会报错,相关jar下载地址:

1.后台controller实例代码:

/**
     * 从EXCEL导入到数据库
     */
    @RequestMapping(value="/readCardExcel")
    public ModelAndView readCourseExcel(
        @RequestParam(value="excel",required=false) MultipartFile file) throws Exception{
        ModelAndView mv = this.getModelAndView();
        PageData pd = new PageData();
        int saveSum=0,updateSum=0,errorSum=0;                                                            //保存成功导入的数
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (null != file && !file.isEmpty()) {
            String filePath = PathUtil.getClasspath() + Const.FILEPATHFILE;                                //文件上传路径
            String fileName =  FileUpload.fileUp(file, filePath, "cardexcel");                            //执行上传
            
            List<PageData> listPd = (List)ObjectExcelRead.readCardExcel(filePath, fileName, 1, 0, 0);    //执行读EXCEL操作,读出的数据导入List 1:从第2行开始;0:从第A列开始;0:第0个sheet
            
            /**
             * var0 :名称
             * var1 :账款
             * var2 :款率
             * var3 :备注
             */
            for(int i=0;i<listPd.size();i++){        
                String var0=listPd.get(i).getString("var0");
                String var1=listPd.get(i).getString("var1");
                String reg = "^[0-9]+(.[0-9]+)?$";                                                                     
                //账款不是数字类型,则跳过
                if(!var1.matches(reg) && !(var1.contains("E") || var1.contains("e"))){
                    continue;
                }
                String var2=listPd.get(i).getString("var2");
                String var3=listPd.get(i).getString("var3");
                pd.put("name", var0);                               
                pd.put("balance",var1);        
                pd.put("ratio",var2);    
                pd.put("updateTime",sdf.format(new Date()));
                //查询名称是否已存在账款,存在则更新
                PageData pdd=receivablesService.selectReceivables(pd);
                if(pdd != null){
                    int updateResult=receivablesService.updateReceivables(pd);
                    updateSum=updateResult==1?updateSum+updateResult:updateResult+0;
                    errorSum=updateResult==1?errorSum+0:errorSum+1;
                }else{
                    int    saveResult=receivablesService.saveReceivables(pd);
                    saveSum=saveResult==1?saveSum+saveResult:saveSum+0;
                    errorSum=saveResult==1?errorSum+0:errorSum+1;
                }
                
            }
            /*存入数据库操作======================================*/
            
            mv.addObject("msg","保存成功 " +saveSum+ " 条,更新"+updateSum+"条,失败:"+errorSum+"条");
        }
        
        mv.setViewName("company/saveReceivables_result");
        return mv;
    }

2.类FileUpload:

package com.credit.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 上传文件13  * @version
 */
public class FileUpload {

    /**
     * @param file             //文件对象
     * @param filePath        //上传路径
     * @param fileName        //文件名
     * @return  文件名
     */
    public static String fileUp(MultipartFile file, String filePath, String fileName){
        String extName = ""; // 扩展名格式:
        try {
            if (file.getOriginalFilename().lastIndexOf(".") >= 0){
                extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            }
            copyFile(file.getInputStream(), filePath, fileName+extName).replaceAll("-", "");
        } catch (IOException e) {
            System.out.println(e);
        }
        return fileName+extName;
    }
    
    /**
     * 写文件到当前目录的upload目录中
     * 
     * @param in
     * @param fileName
     * @throws IOException
     */
    private static String copyFile(InputStream in, String dir, String realName)
            throws IOException {
        File file = new File(dir, realName);
        if (!file.exists()) {
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            file.createNewFile();
        }
        FileUtils.copyInputStreamToFile(in, file);
        return realName;
    }
}

3.读取Excel数据关键代码:readCardExcel

/**
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;

import com.util.PageData;
import com.util.Tools;
     * 读取Excel表格内容----支持xlsx格式和xls格式
     * @param filepath //文件路径
     * @param filename //文件名
     * @param startrow //开始行号
     * @param startcol //开始列号
     * @param sheetnum //sheet
     * @return list
     */
    public static List<Object> readCardExcel(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);
            String suffix=filename.substring(filename.lastIndexOf(".")+1);                //获取文件后缀名
            if("xlsx".equals(suffix)){                                                  		//.xlsx格式读取
                XSSFWorkbook xwb = new XSSFWorkbook(fi);                      //利用poi读取excel文件流
                XSSFSheet sheet = xwb.getSheetAt(sheetnum);                  //读取sheet的第一个工作表
                //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();
                    XSSFRow row = sheet.getRow(i);                             //行
                    int cellNum = row.getLastCellNum();                     //每行的最后一个单元格位置

                    for (int j = startcol; j < cellNum; j++) {                //列循环开始
                        
                        XSSFCell cell = row.getCell(Short.parseShort(j + ""));
                        String cellValue = null;
                        if (null != cell) {
                            switch (cell.getCellType()) {                     // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
                            case 0:
                                DecimalFormat df = new DecimalFormat("0.0000");  
                                cellValue = df.format(cell.getNumericCellValue()); 
//                                cellValue = String.valueOf(cell.getNumericCellValue());
                                break;
                            case 1:
                                cellValue = cell.getStringCellValue();
                                break;
                            case 2:
                                cellValue = cell.getNumericCellValue() + "";
                                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);
                }
            }else if("xls".equals(suffix)){                                     //.xls格式读取
//                XSSFWorkbook xwb = new XSSFWorkbook(fi);                      
//                XSSFSheet sheet = xwb.getSheetAt(sheetnum);                  //读取sheet的第一个工作表
                HSSFWorkbook wb = new HSSFWorkbook(fi);                       //利用poi读取excel文件流
                HSSFSheet sheet = wb.getSheetAt(sheetnum);                     //sheet 从0开始
                int rowNum = sheet.getLastRowNum() + 1;                     //取得最后一行的行号

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

                    for (int j = startcol; j < cellNum; j++) {                //列循环开始
                        
                        //XSSFCell cell = row.getCell(Short.parseShort(j + ""));
                        HSSFCell cell = row.getCell(Short.parseShort(j + ""));
                        String cellValue = null;
                        if (null != cell) {
                            switch (cell.getCellType()) {                     // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
                            case 0:
                                DecimalFormat df = new DecimalFormat("0");  
                                cellValue = df.format(cell.getNumericCellValue());  
//                                cellValue = String.valueOf((int) cell.getNumericCellValue());
                                break;
                            case 1:
                                cellValue = cell.getStringCellValue();
                                break;
                            case 2:
                                 cellValue = cell.getNumericCellValue() + "";
                                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;
    }

3.导出Excel实例
1.controller代码实例

/*
     * 导出到excel
     * @return
     */
    @RequestMapping(value="/excel")
    public ModelAndView exportExcel(){
        logBefore(logger, "导出到excel");
        ModelAndView mv = new ModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        try{
            Map<String,Object> dataMap = new HashMap<String,Object>();
            List<String> titles = new ArrayList<String>();
            titles.add("课程名称");    //1
            titles.add("课程分类");    //2
            titles.add("作用");    //3
            titles.add("目标");    //4
            titles.add("课程开始时间");    //5
            titles.add("课程结束时间");    //6
            titles.add("课程价格");    //7
            titles.add("V卡价格");    //8
            titles.add("是否结束");    //9
            titles.add("课程满足人数");    //10
            titles.add("课程已预约人数");    //11
            titles.add("课程地点");    //12
            titles.add("课程视频地址");    //13
            titles.add("课程介绍");    //14
            titles.add("课程图像");    //15
            titles.add("课程注意事项");    //16
            titles.add("课程群二维码地址");    //17
            titles.add("备注");    //18
            dataMap.put("titles", titles);
            List<PageData> varOList = courseService.listAll(pd);
            List<PageData> varList = new ArrayList<PageData>();
            for(int i=0;i<varOList.size();i++){
                PageData vpd = new PageData();
                vpd.put("var1", varOList.get(i).getString("COURSENAME"));    //1
                vpd.put("var2", varOList.get(i).getString("CLASSIFY"));    //2
                vpd.put("var3", varOList.get(i).getString("EFFECT"));    //3
                vpd.put("var4", varOList.get(i).getString("TARGET"));    //4
                vpd.put("var5", varOList.get(i).getString("COURSETIMEB"));    //5
                vpd.put("var6", varOList.get(i).getString("COURSETIMEE"));    //6
                vpd.put("var7", varOList.get(i).getString("COURSEPRICE"));    //7
                vpd.put("var8", varOList.get(i).getString("VPRICE"));    //8
                vpd.put("var9", varOList.get(i).get("HASOVER").toString());    //9
                vpd.put("var10", varOList.get(i).get("COURSEFULLNUMBER").toString());    //10
                vpd.put("var11", varOList.get(i).get("COURSEORDERNUMBER").toString());    //11
                vpd.put("var12", varOList.get(i).getString("COURSEADD"));    //12
                vpd.put("var13", varOList.get(i).getString("COURSEVIDEO"));    //13
                vpd.put("var14", varOList.get(i).getString("COURSEINTRO"));    //14
                vpd.put("var15", varOList.get(i).getString("COUSERPIC"));    //15
                vpd.put("var16", varOList.get(i).getString("COURSEATTENTION"));    //16
                vpd.put("var17", varOList.get(i).getString("COURSEQRCODE"));    //17
                vpd.put("var18", varOList.get(i).getString("REMARK"));    //18
                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;
    }

2.类ObjectExcelView

package com.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;

import com.util.PageData;
import com.util.Tools;
/**
* 导入到EXCEL
 */
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);
            }
            
        }
        
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值