Java使用Poi进行Excel表格的导入导出总结

记录一次使用Poi读取Excel文件的过程;

1. 首先,在使用工具类读取Excel文件的时候出现了两个问题,针对问题将工具类的方法进行了修改。
  • 读取空值问题:读取内容若为空,报错;
  • 读取时间格式问题:读取2019/7/16 17:11:00类型的时间,使用工具类直接读取,会将时间转换为16-七月-2017,或16-Jul-2017(本机导入会将时间转换为16-七月-2017,打包到服务器之后,导入将时间转换为16-Jul-2017,针对两种时间都有相应的解决方法),转换之后,可以发现,时间格式变为了yyyy-MM-dd,所以需要对方法进行修改,使转换后的时间格式为yyyy-MM-dd HH:mm:ss。下面附上修改后的工具类;
2.工具类(针对遇到的问题修改后的工具类)
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.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class ReadExcelUtils2 {

    /**
     * 读写excel
     */
    public static class RWExcel {

        private static DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        private MultipartFile multipartFile;
        private int sheetNum = 0;

        /**
         * 构造方法
         */
        public RWExcel(MultipartFile multipartFile, int sheetNum) {

            this.multipartFile = multipartFile;
            this.sheetNum = sheetNum;
        }

        /**
         * 读取excel 封装成集合
         * 该程序需要传入一份excel 和excel的列数 行数由程序自动检测
         * 注意:该方法统计的行数是默认第一行为title 不纳入统计的
         *
         * @return
         */
        // @Test
        public ArrayList<List> ReadXLSExcel() {

            // int column = 5;//column表示excel的列数

            ArrayList<List> list = new ArrayList<List>();
            try {
                // 建需要读取的excel文件写入stream   把这个 换成XSSFW 试试看  TODO
                HSSFWorkbook workbook = new HSSFWorkbook(multipartFile.getInputStream());
                // 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
                HSSFSheet sheet = workbook.getSheetAt(sheetNum);
                // 获取sheet1中的总行数
                int rowTotalCount = sheet.getLastRowNum();
                //获取总列数
                int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
                for (int i = 1; i <= rowTotalCount; i++) {
                    // 获取第i列的row对象
                    HSSFRow row = sheet.getRow(i);
                    ArrayList<String> listRow = new ArrayList<String>();
                    for (int j = 0; j < columnCount; j++) {
                        //下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
                        //如果未null则加上""组装成非null的字符串
                        if (row.getCell(j) == null) {
                            listRow.add("");
                            //如果读取到额cell不为null 则直接加入	listRow集合
                        } else {
                           /* cell = row.getCell(j).toString();
                            listRow.add(cell);*/
                            Cell cell = row.getCell(j);
                            switch (cell.getCellTypeEnum()) {
                                case NUMERIC:
                                    if (!DateUtil.isCellDateFormatted(cell)) {
                                        listRow.add(row.getCell(j).toString());
                                    } else {
                                        listRow.add(formater.format(cell.getDateCellValue()));
                                    }
                                    break;
                                case ERROR:
                                    listRow.add("");
                                    break;
                                case BLANK:
                                    listRow.add("");
                                    break;
                                default:
                                    listRow.add(row.getCell(j).toString());
                                    break;
                            }
                        }
                        // 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
                    }
                    list.add(listRow);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }

        public ArrayList<List> ReadXLSXExcel() {
            // int column = 5;//column表示excel的列数
            ArrayList<List> list = new ArrayList<List>();
            try {
                // 建需要读取的excel文件写入stream   把这个 换成XSSFW 试试看  TODO
                XSSFWorkbook workbook = new XSSFWorkbook(multipartFile.getInputStream());
                //HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
                // 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
                XSSFSheet sheet = workbook.getSheetAt(sheetNum);
                // 获取sheet1中的总行数
                int rowTotalCount = sheet.getLastRowNum();
                //获取总列数
                int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
                for (int i = 1; i <= rowTotalCount; i++) {
                    // 获取第i列的row对象
                    XSSFRow row = sheet.getRow(i);
                    ArrayList<String> listRow = new ArrayList<String>();
                    for (int j = 0; j < columnCount; j++) {
                        //下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
                        //如果未null则加上""组装成非null的字符串
                        if (row.getCell(j) == null) {
                            listRow.add("");
                            //如果读取到额cell不为null 则直接加入	listRow集合
                        } else {
                            /*cell = row.getCell(j).toString();
                            listRow.add(cell);*/
                            Cell cell = row.getCell(j);
                            switch (cell.getCellTypeEnum()) {
                                case NUMERIC:
                                    if (DateUtil.isCellDateFormatted(cell)) {
                                        listRow.add(formater.format(cell.getDateCellValue()));
                                    } else {
                                        // objects[index++] = (int) cell.getNumericCellValue();
                                        listRow.add(row.getCell(j).toString());
                                    }
                                    break;
                                case BLANK:
                                    listRow.add("");
                                    break;
                                case ERROR:
                                    listRow.add("");
                                    break;
                                default:
                                    listRow.add(row.getCell(j).toString());
                                    break;
                            }
                        }
                        // 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
                    }
                    list.add(listRow);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }
        
        public static String getMonthNum(String dateStr) {
            try {
                if (!dateStr.contains("-")) {
                    return null;
                } else if (!dateStr.contains("月-")) {
                    SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);
                    Date date = sdf.parse(dateStr);
                    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String dateString = formatter.format(date);
                    return dateString;
                }

                DateFormat fmt = new SimpleDateFormat("dd-MM月-yyyy");

                if (dateStr.contains("十")) {
                    dateStr = dateStr.replace("十一月", "11月");
                    dateStr = dateStr.replace("十二月", "12月");
                    dateStr = dateStr.replace("十月", "10月");
                } else {
                    dateStr = dateStr.replace("一月", "01月");
                    dateStr = dateStr.replace("二月", "02月");
                    dateStr = dateStr.replace("三月", "03月");
                    dateStr = dateStr.replace("四月", "04月");
                    dateStr = dateStr.replace("五月", "05月");
                    dateStr = dateStr.replace("六月", "06月");
                    dateStr = dateStr.replace("七月", "07月");
                    dateStr = dateStr.replace("八月", "08月");
                    dateStr = dateStr.replace("九月", "09月");
                }

                Date date = fmt.parse(dateStr);
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String dateString = formatter.format(date);

                return dateString;

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值