struts2 配合jaxl 制作Excel模板做的报表[云少原创](有了它就不需要每一个单元格都要一个一个敲代码了哈哈)

原创 2013年10月19日 10:10:28
一早上,刚刚把第二张表格模板做好了,我感觉这2天的辛苦没有白费,现在要是想做一个导出报表的事情只需要从数据库里面拿出数据然后将他们组装成一个DataModel这个对象就可以了,我一边说一边把代码拷贝出来,最后有时间我把整个jar包也拷贝出来,里面还有很多地方没有完善,希望各位能提出修改意见,或者是自己做一个哈哈,方便以后做Excel报表呵呵。
public class DataModel {

	private String column;  //列
	private String data;	//数据
	private String row;//行

	public DataModel(String column, String row,String data) {
		this.column = column;
		this.data = data;
		this.row = row;
	}

	public String getColumn() {
		return column;
	}

	public String getData() {
		return data;
	}

	public String getRow() {
		return row;
	}

	public void setColumn(String column) {
		this.column = column;
	}

	public void setData(String data) {
		this.data = data;
	}

	public void setRow(String row) {
		this.row = row;
	}
}

犹豫我这个里面需要插入图片,所以我准备了几个pojo,大家自己看下就懂了!

//图片坐标
public class ImageLocation {
	private double x;
	private double y;
	private double width;
	private double height;
	
	
	public ImageLocation(double x,double y,double width,double height){
		this.x=x;
		this.y=y;
		this.width=width;
		this.height=height;
		}
	public double getX() {
		return x;
	}
	public void setX(double x) {
		this.x = x;
	}
	public double getY() {
		return y;
	}
	public void setY(double y) {
		this.y = y;
	}
	public double getWidth() {
		return width;
	}
	public void setWidth(double width) {
		this.width = width;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}

}
还有一个
ImageModel 
ImageModel 

public class ImageModel {
	private String oldImageDir; //这个是之前的位置
	private String newImageDir;	//这个是复制以后的位置  ,因为图片只能是png ,所以有可能我们之前储存的是其他格式的文件所以我们将图片复制一份待会删//掉
	private ImageLocation imageLocation; //图片坐标

	public ImageLocation getImageLocation() {
		return imageLocation;
	}

	public void setImageLocation(ImageLocation imageLocation) {
		this.imageLocation = imageLocation;
	}

	public String getOldImageDir() {
		return oldImageDir;
	}

	public void setOldImageDir(String oldImageDir) {
		this.oldImageDir = oldImageDir;
	}

	public String getNewImageDir() {
		return newImageDir;
	}

	public void setNewImageDir(String newImageDir) {
		this.newImageDir = newImageDir;
	}

}



让后我再将后面最要的一个类拿出来,这个类主要是方便Action提出请求后给它返回一个InputString,仔细看下代码吧O(∩_∩)O~


public class ExportExcel implements Export {
	/**
	 * 
	 */
	public InputStream createExcel(List<DataModel> fixedDatalist,
			List<DataModel> movedDataList, String templateFrom, String templateTo,
		List<ImageModel> imageList) {
		// TODO Auto-generated method stub
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		createTemplateWorkBook(out, fixedDatalist, movedDataList, templateFrom,
				templateTo, imageList);
		return new ByteArrayInputStream(out.toByteArray());
	}

	/**
	 * 配置jxl相关内容
	 * 
	 * @param out
	 * @param fixedDatalist
	 * @param movedDataList
	 * @param templateFrom
	 * @param templateTo
	 */
	@SuppressWarnings("static-access")
	private void createTemplateWorkBook(ByteArrayOutputStream out,
			List<DataModel> fixedDatalist, List<DataModel> movedDataList,
			String templateFrom, String templateTo, List<ImageModel> imageList) {
		// TODO Auto-generated method stub
		try {
			String excelFile = templateFrom;
			String excelFile2 = templateTo;
			File file = new File(excelFile);
			Workbook wb = Workbook.getWorkbook(new FileInputStream(file));
			WritableWorkbook wwb = wb.createWorkbook(new File(excelFile2), wb);
			WritableSheet sheet = wwb.getSheet(0);
			putAllDataOnOutputStream(wwb, sheet, fixedDatalist, movedDataList,
imageList);// 导入所有数据
			FileInputStream in = new FileInputStream(excelFile2);
			byte[] b = new byte[4096];
			int n;
			while ((n = in.read(b)) != -1) {
				out.write(b, 0, n);
			}
			in.close();

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

	}

	private void putAllDataOnOutputStream(WritableWorkbook wwb,
			WritableSheet sheet, List<DataModel> fixedDataList,
			List<DataModel> movedDataList, List<ImageModel> imageList ) {
		try {
			// 调用单元格样式
			WritableCellFormat writeFontNameCell = cellStyleTemple();
			// TODO Auto-generated method stub
			List<File> returnImageList = null;
			if (fixedDataList!=null) {
				putFixedDatalist(sheet, fixedDataList, writeFontNameCell);// 输入固定数据
			}
			if (movedDataList!=null) {
				putMovedDatalist(sheet, movedDataList, writeFontNameCell);// 插入不确定数据
			}
			if (imageList!=null) {
				returnImageList = putImageDatalist(sheet, imageList,
						writeFontNameCell);// 插入图片
			}
			wwb.write();
			wwb.close();
			if (!imageList.isEmpty()) {
				for (int i = 0; i < returnImageList.size(); i++) {
//					returnImageList.get(i).delete();
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	private void putMovedDatalist(WritableSheet sheet, List<DataModel> movedDataList,
			WritableCellFormat writeFontNameCell) {
		// TODO Auto-generated method stub
		try {
			Label label = null;
			for (int i = 0; i < movedDataList.size(); i++) {
				// 返回值是object
				label = new Label(Integer.parseInt((movedDataList.get(i)
						.getColumn())), Integer.parseInt(movedDataList.get(i)
						.getRow()), movedDataList.get(i).getData(),
						writeFontNameCell);
				sheet.addCell(label);
				label = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 插入图片
	 * @param sheet
	 * @param imageDir
	 * @param writeFontNameCell
	 * @return
	 * @throws IOException 
	 */
	private List<File> putImageDatalist(WritableSheet sheet, List<ImageModel> imageList,
			WritableCellFormat writeFontNameCell) throws IOException {
		// TODO Auto-generated method stub
		 WritableImage writeableImage=null;
		String oldImageDir=null;
		String newImageDir=null;
		List<File> fileList=new ArrayList<File>();//将图片放到list 里面到前面删掉
		for (int i = 0; i < imageList.size(); i++) {
			oldImageDir=imageList.get(i).getOldImageDir();
			newImageDir=imageList.get(i).getNewImageDir();
			if (new File(oldImageDir).exists()) {
				copy(oldImageDir, newImageDir);
				 File newFile= new File(newImageDir);
				 fileList.add(newFile);
				 writeableImage = new WritableImage(imageList.get(i).getImageLocation().getX(), imageList.get(i).getImageLocation().getY(),  
						 imageList.get(i).getImageLocation().getWidth(), imageList.get(i).getImageLocation().getHeight(), newFile);
				 newFile=null;
				 sheet.addImage(writeableImage);
			}
		}
		return fileList;
	}
	
	/**
	 * 复制文件到另一个文件夹
	 * @param infoDetail
	 * @param evaluationDataList
	 * @return
	 * @throws IOException 
	 */
	public  void copy(String  oldDir , String  newDir) throws IOException {   
		FileInputStream in = new FileInputStream(oldDir);
		OutputStream out = new FileOutputStream(newDir);
		byte[] buff = new byte[1024];
		int len = 0;
		while ((len = in.read(buff)) != -1) {
			out.write(buff, 0, len);
		}
		in.close();
		out.close();
     }   
	



	/**
	 * 插入固定数据
	 * 
	 * @param sheet
	 * @param fixedDataList
	 * @param writeFontNameCell
	 */

	private void putFixedDatalist(WritableSheet sheet,
			List<DataModel> fixedDataList, WritableCellFormat writeFontNameCell) {
		// TODO Auto-generated method stub
		try {
			Label label = null;
			for (int i = 0; i < fixedDataList.size(); i++) {
				// 返回值是object
				label = new Label(Integer.parseInt((fixedDataList.get(i)
						.getColumn())), Integer.parseInt(fixedDataList.get(i)
						.getRow()), fixedDataList.get(i).getData(),
						writeFontNameCell);
				sheet.addCell(label);
				label = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 字体,以及单元格样式配置
	 * 
	 * @return
	 * @throws WriteException
	 */
	@SuppressWarnings("unused")
	private WritableCellFormat cellStyleTemple() throws WriteException {
		WritableFont writeNameFontStyle = new WritableFont(WritableFont.ARIAL,
				10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE,
				jxl.format.Colour.BLACK);
		WritableCellFormat writeFontNameCell = new WritableCellFormat(
				writeNameFontStyle);
		writeFontNameCell.setBackground(Colour.LIGHT_GREEN);
		writeFontNameCell.setBorder(Border.ALL, BorderLineStyle.THIN);
		writeFontNameCell.setAlignment(Alignment.CENTRE);
		writeFontNameCell.setVerticalAlignment(VerticalAlignment.CENTRE);
		writeFontNameCell.setWrap(true);
		return writeFontNameCell;
	}

}

下面要做的就是将自己准备好的数据往里面添加就可以拉。。。come on !!!

下面的是action的信息,自己看下有没有什么有用的。

	HttpServletRequest request = ServletActionContext.getRequest();
		IOfficerInfoService officerInfoService = new OfficerInfoService();
		request.setCharacterEncoding("utf-8");
		String officerNum = request.getParameter("officernum");
		InfoDetailEntity infoDetail = officerInfoService
				.getOfficerInfoDetailByOfficerNum(officerNum);
		List<DataModel> evaluationDataList = new ArrayList<DataModel>();
		ComprehensiveEvaluationData comprehensiveEvaluationData = new ComprehensiveEvaluationData();
		evaluationDataList = comprehensiveEvaluationData
				.getFixedEvaluationDataModel(infoDetail, evaluationDataList);
		Export export = new ExportExcel();
		//配置模板信息
		String templateFrom=ServletActionContext.getServletContext()
		.getRealPath("")
		+ "/excel/evaluationTemple1.xls";
		String templateTo=ServletActionContext.getServletContext()
		.getRealPath("")
		+ "/excel/evaluationTemple2.xls";
		//照片的地址配置
		String oldDir=ServletActionContext.getServletContext()
		.getRealPath("")+ "\\picture\\"+infoDetail.getOfficerinfolist().get(0).getOfficerImage();
		String newDir=ServletActionContext.getServletContext()
		.getRealPath("")+ "\\picture\\temp\\"+infoDetail.getOfficerinfolist().get(0).getOfficerImage().substring(0,infoDetail.getOfficerinfolist().get(0).getOfficerImage().indexOf(".jpg"))+".png";
		//配置图片信息
		List<ImageModel> imageList=new ArrayList<ImageModel>();
		ImageModel image=new ImageModel();
		image.setImageLocation(new ImageLocation(9,1,3,8));
		image.setNewImageDir(newDir);
		image.setOldImageDir(oldDir);
		imageList.add(image);
		//配置好的动态数据
		List<DataModel> movedData = new ArrayList<DataModel>();
		movedData=comprehensiveEvaluationData.getMovedEvalutionDataModel(infoDetail, movedData);
		excelStream=export.createExcel(evaluationDataList, movedData, templateFrom, templateTo, imageList);
		downFileName = officerNum + ".xls";

		return "success";


下面贴一下模板和下载后的照片。。



里面有些信息不能拿出来见谅

刚毕业的菜鸟写的  希望大家见谅。。。。希望大家给提点意见也是可以的谢谢!!      下次有时间把他们做成一个jar包 ,然后将路径改成配置文件就万事大吉了吧 。。。还有什么需要改的请大家告诉我下哈 。。。没事下次搞个工作流程,最重要是看源码。。。

Excel报表管理利器

Excel报表管理利器
  • 2015年08月11日 14:33

struts2 配合jaxl 制作Excel模板做的报表[云少原创](有了它就不需要每一个单元格都要一个一个敲代码了哈哈)

一早上,刚刚把第二张表格模板做好了,我感觉这2天的辛苦没有白费,现在要是想做一个导出报表的事情只需要从数据库里面拿出数据然后将他们组装成一个DataModel这个对象就可以了,我一边说一边把代码拷贝出...
  • scychina
  • scychina
  • 2013-10-19 10:10:28
  • 881

ABAP--一个读取EXCEL单元格的内容超过256个字符的代码样例

我们在sap上限初期经常会将EXCEL数据倒入到SAP,sap也为此封装了许多的函数,但是这些函数都有单元文本长度限制。具体介绍如下: 1、 'TEXT_CONVERT_XLS_TO_SAP'单...
  • xx4565715
  • xx4565715
  • 2015-01-16 15:15:41
  • 220

SEO策略之让别人主动链接你——链接诱饵

小编刚从事SEO的时候,总是会以一腔热情发外链、发文章,可做的越多,反而觉得自己的方式是不是太表面化了呢?其实,大神说的做SEO是为了带来流量,那时候的小编觉得排名提高就是SEO的最终目的,可后来才发...
  • weiwei_2016
  • weiwei_2016
  • 2016-04-06 15:02:06
  • 556

用VBA完成报表制作

最近帮朋友做了一个报表统计的excel,因为本人比较懒,就直接用vba写了逻辑,而没有使用公式,代码实现了一些较简单的功能,例:算总收入,总支出,按月份统计的报销额度,根据财务人员给的公式自动算出管理...
  • sinat_29673403
  • sinat_29673403
  • 2016-11-24 10:49:39
  • 1033

用VB控制EXCEL生成报表

csdn_用VB控制EXCEL生成报表 做为一种简捷、系统的 Windows应用程序开发工具,Visual Basic 5 具有强大的数据处理功能,提供了多种数据访问方法,可以方便地存取Microso...
  • txz2003
  • txz2003
  • 2007-01-23 15:42:00
  • 1936

使用IReport制作报表(3)

本文以一个实例讲解如何制作一个报表,通过本节能了解到制作一个报表的步骤、制作报表中常用的组件有那些、常用组件的常用属性、如何连接数据源以及加深理解对上一节将的带区的等内容。       以下是本节讲的...
  • u012843873
  • u012843873
  • 2016-07-04 09:57:05
  • 2207

使用C#和Excel进行报表开发(四)-复制单元格

在用Excel作报表的时候,可能会碰到分页的情况,这样就要分成多个Sheet显示,如果要在每页都保留表头,就需要将第一页作为模板设计的表头部分拷贝到其他的Sheet上,这时就要用用到Excel中的单元...
  • xuejian8888
  • xuejian8888
  • 2007-06-20 19:52:00
  • 545

c#操作Excel模板,替换命名单元格或关键字形成报表

c#操作Excel模板,替换命名单元格或关键字形成报表 一 建立Excel 模板文件 template.xls 1.1 插入命名单元格的方法: 左上角名称框,显示当前...
  • yiyihuazi
  • yiyihuazi
  • 2017-04-18 11:28:22
  • 1109

在intouch中如何使用excel做报表

  • 2015年05月29日 14:19
  • 841KB
  • 下载
收藏助手
不良信息举报
您举报文章:struts2 配合jaxl 制作Excel模板做的报表[云少原创](有了它就不需要每一个单元格都要一个一个敲代码了哈哈)
举报原因:
原因补充:

(最多只允许输入30个字)