`
iehyou
  • 浏览: 135434 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JXL POI 导出excel 包括图片

    博客分类:
  • J2EE
阅读更多
主要的问题还是JXL只支持PNG格式的图片,没辙,只有转换格式再处理.附件是结果图,这里只是贴出来方法.,还有转换图片的时候可能出异常.需要另外处理

	private WritableWorkbook saveXlS(OutputStream os,List items) throws Exception{
		ICItemManager itemMgnt = (ICItemManager) this.getBean("icItemManager");
		LazyDynaBean item = null;
		LazyDynaBean orderContent = null;
		if(items.size()>0){
			item=(LazyDynaBean) items.get(0);
		}
		jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
		// 文档格式名称
		jxl.write.WritableSheet sheet = wwb.createSheet("销售出库", 0);
		//加入文字,改变其字体和底色
		jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20, WritableFont.BOLD, false,
		UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
		
		WritableCellFormat format=new WritableCellFormat(wfc); 
		//把水平对齐方式指定为居中 
		format.setAlignment(jxl.format.Alignment.CENTRE); 
		//把垂直对齐方式指定为居中 
		format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); 
		//设置自动换行
		format.setWrap(true);
		//
		jxl.write.WritableFont wfc2 = new jxl.write.WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD, false,
				UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
		WritableCellFormat contentFormat=new WritableCellFormat(wfc2); 
		contentFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE); 
		contentFormat.setAlignment(jxl.format.Alignment.CENTRE); 
		contentFormat.setWrap(true);
		/**
		 * 第一行
		 */
		//合并单元格
		sheet.mergeCells(0,0,13,1); 
		// 加入文字 0,0是坐标位置
		jxl.write.Label title = new jxl.write.Label(0, 0, "销售出库单");
		title.setCellFormat(format);
		sheet.addCell(title);
		
		jxl.write.Label content =null;
		/**
		 * 第二行
		 */
		sheet.mergeCells(0,2,1,2);
		content = new jxl.write.Label(0, 2, "单据编号");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(2,2,6,2);
		content=new jxl.write.Label(2, 2, item.get("fbillno").toString());content.setCellFormat(contentFormat);
		sheet.addCell(content);
		
		sheet.mergeCells(7,2,8,2);
		content = new jxl.write.Label(7, 2, "日期");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(9,2,13,2);
		content=new jxl.write.Label(9, 2,  (String)item.get("fdate").toString().substring(0,10));content.setCellFormat(contentFormat);
		sheet.addCell(content);
		
		
		/**
		 * 第三行
		 */
		sheet.mergeCells(0,3,1,3);
		content = new jxl.write.Label(0, 3, "审核标志");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(2,3,6,3);
		content=new jxl.write.Label(2, 3, item.get("fcheck").toString());content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(7,3,8,3);
		content = new jxl.write.Label(7, 3, "仓库");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(9,3,13,3);
		content=new jxl.write.Label(9,3, item.get("fstockname").toString());content.setCellFormat(contentFormat);
		sheet.addCell(content);
		
		/**
		 * 第四行
		 */
		sheet.mergeCells(0,4,1,4);
		content = new jxl.write.Label(0, 4, "业务单位");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(2,4,6,4);
		content=new jxl.write.Label(2, 4,item.get("fdepartment").toString());content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(7,4,8,4);
		content = new jxl.write.Label(7, 4, "业务员");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(9,4,13,4);
		content=new jxl.write.Label(9,4, item.get("empFname").toString());content.setCellFormat(contentFormat);
		sheet.addCell(content);
		
		NumberFormat nFormat=NumberFormat.getNumberInstance();
		nFormat.setMaximumFractionDigits(2);//设置小数点后面尾数为2
		
		/**
		 * 第四行
		 */
		sheet.mergeCells(0,5,1,5);
		content = new jxl.write.Label(0, 5, "日期");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(2,5,4,5);
		content = new jxl.write.Label(2, 5, "物料名称");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(5,5,5,5);
		content = new jxl.write.Label(5, 5, "单位");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(6,5,7,5);
		content = new jxl.write.Label(6, 5, "单价");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(8,5,8,5);
		content = new jxl.write.Label(8, 5, "数量");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(9,5,10,5);
		content = new jxl.write.Label(9, 5, "金额");content.setCellFormat(contentFormat);
		sheet.addCell(content);
		sheet.mergeCells(11,5,13,5);
		content = new jxl.write.Label(11, 5, "图片");content.setCellFormat(contentFormat);
		sheet.addCell(content);	
		/**
		 * 第五行
		 */
		int j=items.size();
		for (int i = 0; i < j; i++) {
			orderContent=(LazyDynaBean)items.get(i);
			
			sheet.setRowView(i+6, 1000);
			sheet.setColumnView(i+6, 10);
			
			sheet.mergeCells(0,i+6,1,i+6);
			content = new jxl.write.Label(0, i+6, orderContent.get("fdate").toString().substring(0,10));content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(2,i+6,4,i+6);
			content = new jxl.write.Label(2, i+6, orderContent.get("fitemname").toString());content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(5,i+6,5,i+6);
			content = new jxl.write.Label(5, i+6, orderContent.get("funitname").toString());content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(6,i+6,7,i+6);
			Double fauxprice=Double.parseDouble(orderContent.get("fauxprice").toString());
			content = new jxl.write.Label(6, i+6, nFormat.format(fauxprice));content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(8,i+6,8,i+6);
			Double fauxqty=Double.parseDouble(orderContent.get("fauxqty").toString());
			content = new jxl.write.Label(8, i+6,nFormat.format(fauxqty));content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(9,i+6,10,i+6);
			Double famount=Double.parseDouble(orderContent.get("famount").toString());
			content = new jxl.write.Label(9, i+6,nFormat.format(famount));content.setCellFormat(contentFormat);
			sheet.addCell(content);
			sheet.mergeCells(11,i+6,13,i+6);
			
			//插入图片,由于只支持png格式,需要转换成png.
			List icItemPics = itemMgnt.getICItemPics(Integer.valueOf((String)orderContent.get("pfitemid")));
			File outputFile=null;
			ICItemAttach ica = null;
			if(icItemPics.size()>0){
				ica = (ICItemAttach) icItemPics.get(0);
				File imgFile =new File(this.getServlet().getServletContext().getRealPath("repository") + File.separator + ica.getParentNumber() + File.separator
						+ ica.getFNumber() + File.separator + ica.getFfilename());
				System.err.println(imgFile.getCanonicalPath());
				if(imgFile.exists()&&imgFile.length()>0){
					BufferedImage input=null;
					try {
						input = ImageIO.read(imgFile);
					} catch (Exception e) {
						e.printStackTrace();
					}
					if(input!=null){
						String path=imgFile.getAbsolutePath();
						outputFile = new File(path.substring(0,path.lastIndexOf('.')+1)+"png");
						ImageIO.write(input, "PNG", outputFile);
						if(outputFile.exists()&&outputFile.length()>0){
							WritableImage image = new WritableImage(11, i+6, 3, 1, outputFile);
							sheet.addImage(image);
						}
					}
					
				}
			}
		}
		return wwb;
	}




POI :


public static void main(String[] args)throws Exception {
        //声明一个工作薄
        HSSFWorkbook wb=new HSSFWorkbook();
        //生成一个表格
        HSSFSheet sheet=wb.createSheet("表格1");
        //生成一个列
        HSSFRow row=sheet.createRow(0);
        //生成一个样式
        HSSFCellStyle style=wb.createCellStyle();
        //设置这些样式
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //生成一个字体
        HSSFFont font=wb.createFont();
        font.setColor(HSSFColor.VIOLET.index);
        font.setFontHeightInPoints((short)16);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        //把字体应用到当前的样式
        style.setFont(font);
        //声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        //填充单元格
        for(short i=0;i<5;i++){
            //声明一个单元格
            HSSFCell cell=row.createCell(i);
            switch(i){
                case 0:
                    //设置普通文本
                    cell.setCellValue(new HSSFRichTextString("普通文本"));
                    break;
                case 1:
                    //设置为形状
                    HSSFClientAnchor a1 = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
                    HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
                    //这里可以设置形状的样式
                    shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
                    
                    break;
                case 2:
                    //设置为布尔量
                    cell.setCellValue(true);
                    break;
                case 3:
                    //设置为double值
                    cell.setCellValue(12.5);
                    break;
                case 4:
                    //设置为图片]
                    URL url=POITest.class.getResource("hello.jpg");
                    if(url!=null){
                    	insertImage(wb,patriarch,getImageData(ImageIO.read(url)),0,4,1);
                        break;
                    }
                    
                    
            }
            
            //设置单元格的样式
            cell.setCellStyle(style);
        }
        FileOutputStream fout=new FileOutputStream("我的第一个EXCEL.xls");
        //输出到文件
        wb.write(fout);
        fout.close();
    }
    //自定义的方法,插入某个图片到指定索引的位置
    private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){
    	//单元格为标,以左上为起点,想右移,范围0-1023  dx1 must be between 0 and 1023
        int x1=0;
        //单元格为标,以左上为起点,想下移,范围0-1023  dy1 must be between 0 and 255
        int y1=0;
        //单元格为标,以右上为起点,想左移,范围0-1023  dx1 must be between 0 and 1023
        int x2=100;
        //单元格为标,以右下为起点,想上移,范围0-1023  dy1 must be between 0 and 255
        int y2=22;
        HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row);
        
        anchor.setAnchorType(3);
        pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG));
    }
    //从图片里面得到字节数组
    private static  byte[] getImageData(BufferedImage bi){
        try{
        	//转化成PNG
            ByteArrayOutputStream bout=new ByteArrayOutputStream();
            ImageIO.write(bi,"PNG",bout);
            return bout.toByteArray();
        }catch(Exception exe){
            exe.printStackTrace();
            return null;
        }
    }

  • 大小: 48.3 KB
分享到:
评论
2 楼 522823979 2016-11-14  
      
1 楼 贝塔ZQ 2016-09-21  
实现导出excel文件和图片,感觉用poi和jxl代码量好多,还容易出现问题,用插件么,简单方便,PageOffice插件就是专门操作处理office文档的,集成起来也方便,官网上他们也提供了不少事例代码,看起来也方便,可以了解了解。

相关推荐

    JXL 和 POI 操作Excel 表格

    POI支持更广泛的Excel特性,如样式、图表、图片、公式等,并且兼容Excel 97到2016的版本。 使用POI操作Excel的基本步骤与JXL类似,但POI的API更为复杂和强大: 1. 引入POI库的依赖。 2. 创建`Workbook`对象,可以...

    jxls-poi导出excel示例代码文件

    4. **导出Excel**:最后,`jxls-poi`会生成一个新的Excel文件,其中包含了从JSON数据填充后的内容。你可以选择保存到本地或者直接通过HTTP响应发送给用户下载。 具体代码示例可能如下: ```java import org.jxls....

    JXL、POI实现Excel导入导出

    以上就是关于使用JXL和Apache POI实现Excel导入导出的基本知识。根据实际需求,你可以结合这两个库的功能,灵活地处理各种Excel文件操作。在实际项目中,通常会根据性能、功能需求以及文件兼容性等因素选择适合的库...

    poi jxl 生成EXCEL 报表

    Apache POI 和 JExcelAPI(JXL)是两个广泛使用的库,分别用于处理Microsoft Office的POI格式(包括Excel)和Java环境中的Excel文件。下面将详细阐述这两个库以及如何使用它们来生成Excel报表。 Apache POI 是一个...

    Excel导入导出 jxl及Poi 工具类

    为了更好地理解这两个库的用法,你可以查看提供的"Excel导入导出(jxl及Poi)工具类"压缩包中的示例代码。通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中应用jxl和Apache POI。 总的来说,jxl和Apache ...

    jxl导出excel总结

    《jxl导出Excel的深度解析与应用》 在信息化高度发展的今天,Excel作为数据处理和分析的重要工具,被广泛应用于各个领域。Java作为一种强大的编程语言,如何与Excel进行交互,成为了许多开发者关注的焦点。jxl库...

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域...对于更复杂的需求,可能需要考虑使用其他库,如Apache POI,它提供了更丰富的功能来处理Excel文档,包括更精细的图像操作。

    Excel生成导出JXL和POI两种方式小demo

    然而,当需要大量生成或导出Excel文件时,直接使用Excel软件可能效率低下。此时,开发者通常会借助编程语言来实现自动化操作,Java中就有两个常用的库,即JXL和Apache POI,用于读写Excel文件。下面我们将详细探讨这...

    java使用JXL导入导出excel

    Java使用JXL库进行Excel导入导出是一种常见的技术实践,特别是在需要在Java应用程序或Web应用中处理Excel数据时。JXL是一个轻量级的库,它允许开发人员以纯Java方式读取、创建和修改Excel文件,而无需依赖于Windows...

    jsp+poi导出excel.docx

    jsp+poi导出excel.docx 本文档主要讲述了使用jsp和poi组件来导出excel文件的方法。下面是对标题、描述、标签和部分内容的详细解释。 首先,标题“jsp+poi导出excel.docx”表明了本文档的主要内容是使用jsp和poi来...

    POI和JXL两种方式导出EXCEL

    `ExportExcelController.java`可能包含控制器代码,用于接收请求并调用导出Excel的方法,而`ExcelStyle.java`和`ExcelAnnotation.java`可能分别用于定义Excel的样式和注解,以增强Excel的展示效果和元数据。...

    jxl poi技术对excel操作

    jxl jxl包 poi技术导出数据至excel中 poi-bin-2.5.1包 jxl对excel表格 代码操作 poi技术 java代码从数据库取数据导入至Excel表中 poi-bin-2.5.1-final-20040804.jar

    SpringBoot整合poi实现Excel文件的导入和导出.pdf

    同样,导出Excel功能可以通过创建一个新的工作簿,填充数据,然后设置样式和写入输出流来实现。以下是一个简单的导出示例: ```java @GetMapping("exportList") public void exportList(HttpServletResponse ...

    java操作excel——jxl和poi比较

    本文将对比两种主流的Java Excel处理库:jxl和Apache POI,并探讨它们的特性和适用场景。 首先,jxl是较早的Java Excel处理库,主要用于读写Excel 97-2003格式的.XLS文件。它的API简洁,易于上手,对于简单的读写...

    使用JXL和POI实现EXCEL的导入和导出及DTREE的使用

    在Java开发中,处理Excel数据是一项常见的任务,无论是读取现有的..."ExportExcel"可能是项目中用于导出Excel的类或者方法,具体实现细节可能包含解析数据,创建工作簿,写入数据,以及可能的DTREE模型预测结果的导出。

    jxl poi java操作excel

    - `java_Jxl导入导出Excel表.doc`和`POI导入导出EXCEL文件.doc`可能会详细讲解如何使用这两个库进行数据的导入导出。 - `jxl中文教程.doc`、`jxl.doc`和`jxl_api.docx`是jxl库的中文教程和API文档,可以帮助开发者...

    通过JXL使用模板导出EXCEL

    本文将深入探讨如何利用JXL库通过模板来导出Excel。 首先,JXL库(Java Excel API)是一个开源的Java库,它提供了处理Microsoft Excel文件的能力。它支持读取、写入以及修改Excel 97-2004(.xls)格式的文件。虽然...

    Java通过POI和JXL给Excel动态添加水印

    ### Java通过POI和JXL给Excel动态添加水印 #### 概述 在实际工作中,经常需要对敏感或重要的Excel文件进行保护措施,比如添加水印。这不仅可以增加文档的专业性,还可以作为版权保护的一种手段。本文将详细介绍...

    操作Excel文件(读取和生成)jxl和poi

    JXL和Apache POI是两个广泛使用的库,分别提供了对Excel文件的读取和生成的支持。本篇文章将深入探讨这两个库的使用方法及其特点。 首先,JXL是一个Java API,主要用于读写Excel 97-2003格式的工作簿,即.xls文件。...

Global site tag (gtag.js) - Google Analytics