使用POI做文件下载,使文件下载到固定路径,并直接转存为pdf格式文件 ----java

主要介绍一下POI下载文件到固定流程,并直接转存为pdf格式的数据
使用到的pom依赖

		<dependency>
			<groupId>net.sourceforge.jexcelapi</groupId>
			<artifactId>jxl</artifactId>
			<version>2.6.12</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.13</version>
		</dependency>

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

第一步:获取到下载数据的集合,用自己项目中的方法,这个地方不做展示

第二步:通过数据集合,POI做下载操作(####只展示重要的代码片段)

		try{
			HSSFWorkbook wb = new HSSFWorkbook();
			// 建立新的sheet对象(excel的表单)
			HSSFSheet sheet = wb.createSheet("sheet1");
			//申明单元格对象
			HSSFCell cell;
			//添加标题
			HSSFRow row = sheet.createRow(0);
			//合并单元格
			sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));
			row.createCell(0).setCellValue("标题名称");
			//添加导出人
			HSSFRow row1 = sheet.createRow(1);
			sheet.addMergedRegion(new CellRangeAddress(1,1,0,4));
			row1.createCell(0).setCellValue("导出人"+获取到自己的);
			// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
			HSSFRow row2 = sheet.createRow(2);
			//根据索引添加每列的标题
			row2.createCell(0).setCellValue("项目名称");
			row2.createCell(1).setCellValue("单位名称");
			row2.createCell(2).setCellValue("项目总投标金额");
			row2.createCell(3).setCellValue("审核人签字");
			row2.createCell(4).setCellValue("审核意见");
			int i = 3;
			//遍历获取到的集合
			for (ScBidProjectEntity b : scBidProjects) {
				//创建新的一行
				HSSFRow row3 = sheet.createRow(i);
				//添加数据(###数据获取以自己集合字段为主,在这里只是演示)
				cell = row3.createCell(0);
				ScTenderProjectEntity entity1 = systemService.getEntity(ScTenderProjectEntity.class, b.getTenderId());
				cell.setCellValue(entity1.getProjectName());

				cell = row3.createCell(1);
				ScCustomerEntity entity2 = systemService.getEntity(ScCustomerEntity.class, Integer.parseInt(b.getBidUser().toString()));
				cell.setCellValue(entity2.getCompany());

				cell = row3.createCell(2);
				cell.setCellValue(Double.parseDouble(b.getTotalPrice().toString()));

				cell = row3.createCell(3);
				cell.setCellValue(entity.getVerifyUserNames());
				
				cell = row3.createCell(4);
				cell.setCellValue(entity.getVerifyUserNames());
				
				//每次走一遍之后 i需要添加  就相当于是重新添加一行
				i++;
			}
			//自适应列宽
			sheet.setColumnWidth(0, 256*35+184);
			sheet.setColumnWidth(1, 256*35+184);
			sheet.setColumnWidth(2, 256*35+184);
			sheet.setColumnWidth(3, 256*35+184);
			sheet.setColumnWidth(4, 256*35+184);
			//导出excel
			//自定义的路径
			String rootPath = ConfigUtil.getCurrentValue("FILE_ROOT_PATH","A16");(##可以使用死路径)
			//获取年月日
			Calendar calendar = Calendar.getInstance();//时间calendar对象
			String year = String.valueOf(calendar.get(Calendar.YEAR));//年
			String month = (calendar.get(Calendar.MONTH) + 1) < 10 ? "0" + (calendar.get(Calendar.MONTH) + 1) : String.valueOf((calendar.get(Calendar.MONTH) + 1));//月
			String day = calendar.get(Calendar.DAY_OF_MONTH) < 10 ? "0" + calendar.get(Calendar.DAY_OF_MONTH) : String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));//日
			String path = rootPath + File.separator + "MakeExcel" + File.separator + year + File.separator + month + File.separator + day;
			//判断路径是否存在,不存在就新建
			File file = new File(path);
			if (!file.exists()) {
				file.mkdirs();
			}
			//拼接处全路径
			String outUrl = path + File.separator + entity.getProjectNo()+"_"+"比价结果采购记录表.xls";
			FileOutputStream out = new FileOutputStream(outUrl);
			wb.write(out);//写入磁盘
			out.close();
		}catch (Exception e){
			fileDown.setIsOrNo("false");
		}

第三步:使用POI进行下载excel操作之后直接转存为pdf文件(####只展示重要的代码片段)

//转换PDF
	//转存的路径
	String putUrl = path + File.separator + entity.getProjectNo()+"_"+"比价结果采购记录表.pdf";
	//工具类方法
	ExcelToPdf.ExcelChangePdf(outUrl,putUrl);

转存pdf的工具类(直接新建一个类,复制进去就可以)

public static void ExcelChangePdf(String url,String PutUrl) throws DocumentException, IOException {
        Document document = new Document(PageSize.A4,0,0,50,0);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(PutUrl));
        //字体设置
        /*
         * 由于itext不支持中文,所以需要进行字体的设置,我这里让itext调用windows系统的中文字体,
         * 找到文件后,打开属性,将文件名及所在路径作为字体名即可。
         */
        //创建BaseFont对象,指明字体,编码方式,是否嵌入
        BaseFont bf=BaseFont.createFont("C:\\Windows\\Fonts\\simkai.ttf", BaseFont.IDENTITY_H, false);
        //创建Font对象,将基础字体对象,字体大小,字体风格
        Font font=new Font(bf,13, Font.NORMAL);
        int rowNum = 0;
        int colNum = 0;
        try {
            Workbook workbook= Workbook.getWorkbook(new File(url));
            Sheet sheet=workbook.getSheet(0);
            int column=sheet.getColumns();
            //下面是找出表格中的空行和空列
            List<Integer> nullCol = new ArrayList<>();
            List<Integer> nullRow = new ArrayList<>();
            for(int j=0;j<sheet.getColumns();j++){
                int nullColNum = 0;
                for(int i=0;i<sheet.getRows();i++){
                    Cell cell=sheet.getCell(j, i);
                    String str = cell.getContents();
                    if(str == null || "".equals(str)){
                        nullColNum ++ ;
                    }
                }
                if(nullColNum == sheet.getRows()){
                    nullCol.add(j);
                    column--;
                }
            }
            for(int i=0;i<sheet.getRows();i++){
                int nullRowNum = 0;
                for(int j=0;j<sheet.getColumns();j++){
                    Cell cell=sheet.getCell(j, i);
                    String str = cell.getContents();
                    if(str == null || "".equals(str)){
                        nullRowNum ++ ;
                    }
                }
                if(nullRowNum == sheet.getColumns()){
                    nullRow.add(i);
                }
            }
            PdfPTable table=new PdfPTable(column);
            Range[] ranges = sheet.getMergedCells();

            PdfPCell cell1=new PdfPCell();
            for(int i=0;i<sheet.getRows();i++){
                if(nullRow.contains(i)){    //如果这一行是空行,这跳过这一行
                    continue;
                }
                for(int j=0;j<sheet.getColumns();j++){
                    if(nullCol.contains(j)){    //如果这一列是空列,则跳过这一列
                        continue;
                    }
                    boolean flag = true;
                    Cell cell=sheet.getCell(j, i);
                    String str = cell.getContents();
                    for(Range range : ranges){    //合并的单元格判断和处理
                        if(j >= range.getTopLeft().getColumn() && j <= range.getBottomRight().getColumn()
                                && i >= range.getTopLeft().getRow() && i <= range.getBottomRight().getRow()){
                            if(str == null || "".equals(str)){
                                flag = false;
                                break;
                            }
                            rowNum = range.getBottomRight().getRow() - range.getTopLeft().getRow()+1;
                            colNum = range.getBottomRight().getColumn() - range.getTopLeft().getColumn()+1;
                            if(rowNum > colNum){
                                cell1 = mergeRow(str, font, rowNum);
                                cell1.setColspan(colNum);
                                table.addCell(cell1);
                            }else {
                                cell1 = mergeCol(str, font, colNum);
                                cell1.setRowspan(rowNum);
                                table.addCell(cell1);
                            }
                            //System.out.println(num1 + "  " + num2);
                            flag = false;
                            break;
                        }
                    }
                    if(flag){
                        table.addCell(getPDFCell(str,font));
                    }
                }
            }
            workbook.close();
            document.open();
            document.add(table);
            document.close();
            writer.close();
        } catch (BiffException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //合并行的静态函数
    public static PdfPCell mergeRow(String str,Font font,int i) {
        //创建单元格对象,将内容及字体传入
        PdfPCell cell=new PdfPCell(new Paragraph(str,font));
        //设置单元格内容居中
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        //将该单元格所在列包括该单元格在内的i行单元格合并为一个单元格
        cell.setRowspan(i);
        return cell;
    }

    //合并列的静态函数
    public static PdfPCell mergeCol(String str, Font font, int i) {
        PdfPCell cell=new PdfPCell(new Paragraph(str,font));
        cell.setMinimumHeight(25);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        //将该单元格所在行包括该单元格在内的i列单元格合并为一个单元格
        cell.setColspan(i);
        return cell;
    }

    //获取指定内容与字体的单元格
    public static PdfPCell getPDFCell(String string, Font font){
        //创建单元格对象,将内容与字体放入段落中作为单元格内容
        PdfPCell cell=new PdfPCell(new Paragraph(string,font));
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        //设置最小单元格高度
        cell.setMinimumHeight(25);
        return cell;
    }

第四步:下载pdf文件到浏览器默认路径(只展示导出部分代码,前台代码使用的是jsp,ajax)

//下载pdf
//最后做返回使用
		FileDown fileDown = new FileDown();
		//自己存储的路径
			String fileName = entity.getProjectNo()+"_"+"比价结果采购记录表.pdf";
			//可以写的时候加上根路径
			String fileUrl = "MakeExcel" + File.separator + year + File.separator + month + File.separator + day;
			String replace1 = (fileUrl).replace("\\", "/");
			fileDown.setFileName(fileName);
			fileDown.setFileUrl(replace1);

注意:不能直接在导出方法中直接使用导出方法
给出一个个人思路,可以新加一个实体类,里边有文件路径,文件名称。把实体类传到前台ajax接收,通过路径,名称实现文件下载
每个人做下载的思路都不一样,这只是我的方法

/**
     * 文件下载
     * @param request
     * @param response
     * @throws Exception
     * @throws IOException
     */
    @RequestMapping("/download")
    public void  downloadfile(@RequestParam(value="filesUrl", required=false) String filesUrl,@RequestParam(value="filesName", required=false) String filesName,
                              HttpServletRequest request,HttpServletResponse response) throws Exception, IOException{
        //这个地方是一个工具类,可以写成自己的路径,死路径也可以,主要就是下做拼接使用的,根路径
        String rootPath = ConfigUtil.getCurrentValue("FILE_DOWNLOAD_PATH","A17");
        String files =rootPath+ File.separator + filesUrl + File.separator + filesName;
        if (!StringUtils.isEmpty(files)) {
            response.setContentType("application/file;charset=UTF-8");
            response.setHeader("Content-disposition", "attachment; filename=\"" + new String(filesName.getBytes("utf-8"), "iso-8859-1") + "\"");
            try{
                FileCopyUtils.copy(new FileInputStream(new File(files)), response.getOutputStream());
            }catch (FileNotFoundException e){
                e.getMessage();
            }
        }
    }

总结:以上就是我的解决方案,记录一下,如果有不对的地方,请指正。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值