Excel文件的读取和生成(Java)

添加依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

检查文件类型

public static void checkFile(MultipartFile file) throws IOException{
    	if(null == file){
    		throw new FileNotFoundException("文件不存在!");
    	}
    	String fileName = file.getOriginalFilename();
    	if(!fileName.endsWith("xls") && !fileName.endsWith("xlsx")){
    		throw new IOException(fileName + "不是excel文件");
    	}
}

获得工作簿(Workbook)

    public static Workbook getWorkBook(MultipartFile file) {
    	String fileName = file.getOriginalFilename();
		Workbook workbook = null;//创建Workbook工作薄对象,表示整个excel
		try {
			InputStream is = file.getInputStream();
			//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
			if(fileName.endsWith("xls")){
				workbook = new HSSFWorkbook(is);//2003
			}else if(fileName.endsWith("xlsx")){
				workbook = new XSSFWorkbook(is);//2007
			}
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		return workbook;
	}

获得单元格的字符串值

public static String getCellValue(Cell cell){
		String cellValue = "";
		if(cell == null){
			return cellValue;
		}
		if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){//把数字当成String来读,避免出现1读成1.0的情况
			cell.setCellType(Cell.CELL_TYPE_STRING);
		}
		//判断数据的类型
        switch (cell.getCellType()){
	        case Cell.CELL_TYPE_NUMERIC: //数字
	            cellValue = String.valueOf(cell.getNumericCellValue());
	            break;
	        case Cell.CELL_TYPE_STRING: //字符串
	            cellValue = String.valueOf(cell.getStringCellValue());
	            break;
	        case Cell.CELL_TYPE_BOOLEAN: //Boolean
	            cellValue = String.valueOf(cell.getBooleanCellValue());
	            break;
	        case Cell.CELL_TYPE_FORMULA: //公式
	            cellValue = String.valueOf(cell.getCellFormula());
	            break;
	        case Cell.CELL_TYPE_BLANK: //空值 
	            cellValue = "";
	            break;
	        case Cell.CELL_TYPE_ERROR: //故障
	            cellValue = "非法字符";
	            break;
	        default:
	            cellValue = "未知类型";
	            break;
        }
		return cellValue;
	}

由整个excell转化为List<String[]>

public static List<String[]> readExcel(MultipartFile files) throws IOException {
        //检查文件
        checkFile(files);
        //获得Workbook工作薄对象
        Workbook workbook = getWorkBook(files);
        //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
        List<String[]> list = new ArrayList<>();
        if (workbook != null) {
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                //获得当前sheet工作表
                Sheet sheet = workbook.getSheetAt(sheetNum);
                if (sheet == null) {
                    continue;
                }
                //获得当前sheet的开始行
                int firstRowNum = sheet.getFirstRowNum();
                //获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                //循环除了第一行的所有行
                for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
                    //获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null || row.getPhysicalNumberOfCells() == 0) {
                        continue;
                    }
                    //获得当前行的开始列
                    int firstCellNum = row.getFirstCellNum();
                    //获得当前行的结束列
                    int lastCellNum = row.getLastCellNum();
                    String[] cells = new String[lastCellNum];
                    //循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        if (null == cell){
                            cells[cellNum] = "";
                            continue;
                        }
                        String guarantee_date = "";
                        //判断是否为日期类型
                        if (0 == cell.getCellType()) {
                            if (DateUtil.isCellDateFormatted(cell)) {
                                //用于转化为日期格式
                                Date d = cell.getDateCellValue();
                                DateFormat formater = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
                                guarantee_date = formater.format(d);
                                cells[cellNum] = guarantee_date;
                            } else {
                                int num = (int) cell.getNumericCellValue();
                                cells[cellNum] = String.valueOf(num);
                            }
                        } else {
                            cells[cellNum] = getCellValue(cell);
                        }
                    }
                    list.add(cells);
                }
            }
        }

        return list;
    }

如果读取到的日期为数字的话,使用下面方法转化

    private Date getDateFromExcelNumber(String number) {
        Calendar calendar = new GregorianCalendar(1900, 0, -1);
        Date d = calendar.getTime();
        return DateUtils.addDays(d, Integer.valueOf(number));
    }

以上是读取excel文件的,下面是生成excel文件!

创建工作簿

XSSFWorkbook workbook = new XSSFWorkbook();//2007

创建sheet页

XSSFSheet sheet = workbook.createSheet("sheet页的名称");

单元格属性设置

CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStale.setWrapText(true);//设置自动换行
cellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());//背景色
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);//填充背景色

XSSFFont font= workbook.createFont();
font.setFontName("Calibri");
font.setFontHeightInPoints((short) 10);//设置字体大小
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//粗体显示
cellStyle.setFont(font);//选择需要用到的字体格式

时间类型的数据格式设置

cellStyle.setDataFormat(
workbook.getCreationHelper().createDataFormat().getFormat("yyyy/mm/dd")
);

设置列宽

sheet.setDefaultColumnWidth((short) 12);// 设置表格默认列宽度为10个字节
sheet.setColumnWidth(0, 6*256);// 第一列设置6个字节宽度

新建一行,设置行高

XSSFRow row = sheet.createRow(0);//第一行,一般是标题行,需要单独的样式
row.setHeight((short) (40*15.625));

设置标题行文字和样式(其余行以此类推)

String[] headers = {"序号","标题列1","标题列2","标题列3","标题列4","标题列5", "标题列6"};
for (short i = 0; i < headers.length; i++) {
		XSSFCell cell = row.createCell(i);//新建单元格
		XSSFRichTextString text = new XSSFRichTextString(headers[i]);
		cell.setCellValue(text);//设置文本
		cell.setCellStyle(titleStyle);//设置样式
}

保存文件

String filePath = "路径和文件名.xlsx";
FileOutputStream fileOutputStream = new FileOutputStream(filePath);//指定路径与名字和格式
workbook.write(fileOutputStream);//将数据写出去
fileOutputStream.close();//关闭输出流

下载文件到客户端

参考自:https://blog.csdn.net/fengchao2016/article/details/55188805

https://blog.csdn.net/wanghaoqian/article/details/78284654

private static void downloadFile(File file, HttpServletRequest request,HttpServletResponse response) {
        String fileName = "中文.xlsx";
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            fin = new FileInputStream(file);
            out = response.getOutputStream();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/octet-stream");
            boolean isMSIE = isMSBrowser(request);
            if (isMSIE) {
                //IE浏览器的乱码问题解决
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                //万能乱码问题解决
                fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
            }
            response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");

            byte[] buffer = new byte[1024];
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(fin != null) {
                try {
                    fin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
    private static boolean isMSBrowser(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent");
        for (String signal : IEBrowserSignals) {
            if (userAgent.contains(signal))
                return true;
        }
        return false;
    }

觉得有用的老铁给个双击!

发布了78 篇原创文章 · 获赞 131 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/river66/article/details/96097419