数据导出Excel和Word功能

package ais.mytest.web;
/**
 * 功能:主要实现数据导出Excel和Word功能
 * 日期:2012-3-19 */
import ais.basic.service.BasicUtil;
import ais.commons.file.service.FileService;
import ais.framework.web.BaseAction;
import ais.mytest.model.Employeer;
import ais.mytest.service.IemployeerService;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.DecimalFormat;

import jxl.write.NumberFormat;
import java.util.List;
import javax.servlet.ServletOutputStream;
import jxl.Cell;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.BoldStyle;
import jxl.format.Colour;
import jxl.write.Blank;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

//import com.ibm.icu.text.SimpleDateFormat;
//import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;
import java.awt.Color;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
public class ExportAction extends BaseAction{
	/**
	 * 
	 */
	private static final long serialVersionUID = -3951404867065653031L;
	FileService fileService;
	BasicUtil basicUtil;
	IemployeerService iemployeerService;
	Employeer employeer;
	String filename=System.currentTimeMillis()+".doc";
	public ExportAction() {}
	
	/**
	 * 功能:将数据库中的数据导出word
	 * 日期:2008-2-29
	 * @return 
	 */
	// 复制一份新的RTF文件
	public String getNewFilePath() throws Exception {
		
		InputStream ins = ServletActionContext.getServletContext().getResourceAsStream("/empty.doc");
		byte[] b = new byte[ins.available()];
		ins.read(b);
		ins.close();
		String newFileName = ServletActionContext.getServletContext().getRealPath("")+ "/"+filename;
		OutputStream ous = new FileOutputStream(newFileName);
		ous.write(b);
		ous.close();
		return newFileName;
	}
    //	 将二进制流写到客户端
	public void writeNewFile(String newFilePath, String downloadFileName)
			throws Exception {
		File f = new File(newFilePath);
		InputStream ins = new FileInputStream(f);
		byte[] b = new byte[ins.available()];
		ins.read(b);
		ins.close();
/*		<option   value="image/bmp">BMP</option>   
		<option   value="image/gif">GIF</option>   
		<option   value="image/jpeg">JPEG</option>   
		<option   value="image/tiff">TIFF</option>   
		<option   value="image/x-dcx">DCX</option>   
		<option   value="image/x-pcx">PCX</option>   
		<option   value="text/html">HTML</option>   
		<option   value="text/plain">TXT</option>   
		<option   value="text/xml">XML</option>   
		<option   value="application/afp">AFP</option>   
		<option   value="application/pdf">PDF</option>
		<option   value="application/pdf">zip</option>     
		<option   value="application/rtf">RTF</option>   
		<option   value="application/msword">MSWORD</option>   
		<option   value="application/vnd.ms-excel">MSEXCEL</option>   
		<option   value="application/vnd.ms-powerpoint">MSPOWERPOINT</option>   
		<option   value="application/wordperfect5.1">WORDPERFECT</option>   
		<option   value="application/vnd.lotus-wordpro">WORDPRO</option>   
		<option   value="application/vnd.visio">VISIO</option>   
		<option   value="application/vnd.framemaker">FRAMEMAKER</option>   
		<option   value="application/vnd.lotus-1-2-3">LOTUS123</option>*/
		/**
		 * 出现保存与打开对话框application/octet-stream,加上下面第二句是保存时能正确出现文件类型
		 */
		//getResponse().setContentType("application/octet-stream"); 
		//getResponse().setHeader("Content-Disposition","attachment;filename=\""+ new String((downloadFileName).getBytes(),"ISO-8859-1") + "\";");
		/**
		 * 直接打开word文档
		 */
		getResponse().setContentType("application/msword");
		ServletActionContext.getResponse().getOutputStream().write(b);
		//文件删除
		if (f != null) {
			f.delete();
		}
	}
	/**
	 * @param em_name 姓名
	 * @param em_sex  性别
	 * @param em_age  年龄
	 * @param em_duty 职务
	 * @param em_pay  工资
	 * @param em_polity  政治面貌
	 * @param em_address 住址
	 */
	public void createWord(String eMname,String eMsex,int eMage,String eMduty, Double eMpay, String eMpolity,String eMaddress) throws Exception {
		// 创建word文档
		Document document = new Document(PageSize.A4);
		// 输入word文档
		String newFilePath = getNewFilePath();
		RtfWriter2.getInstance(document, new FileOutputStream(newFilePath));
		document.open();
		// 中文字体
		BaseFont bfChinese = BaseFont.createFont("STSongStd-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
		Font fontChinese = new Font(bfChinese, 12, Font.BOLD);
		
		Table table = new Table(4, 4);
       
		Paragraph paragraph = new Paragraph("XX单位员工信息表", fontChinese);
		paragraph.setAlignment(Paragraph.ALIGN_CENTER);
		document.add(paragraph);
		table.setBorderWidth(2);
		table.setBorderColor(new Color(0, 0, 0));
		table.setPadding(5);
		table.setSpacing(0);
		table.setAutoFillEmptyCells(true);

		com.lowagie.text.Cell cell = new com.lowagie.text.Cell(new Paragraph("姓名", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(eMname);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("性别", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(eMsex);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("年龄", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(Integer.valueOf(eMage).toString());
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("政治面貌", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(eMpolity);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("职务", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(eMduty);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("工资", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(Double.valueOf(eMpay).toString());
		//cell.setColspan(5);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("住址", fontChinese));
		table.addCell(cell);
		cell = new com.lowagie.text.Cell(eMaddress);
		cell.setColspan(3);
		table.addCell(cell);


		cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n教育背景:\n\n\n", fontChinese));
		cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		table.addCell(cell);
		cell = new com.lowagie.text.Cell("");
		cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setColspan(3);
		table.addCell(cell);

		cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n工作经历\n\n\n",fontChinese));
		cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		table.addCell(cell);
		cell = new com.lowagie.text.Cell( "");
		cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setColspan(3);
		table.addCell(cell);


		cell = new com.lowagie.text.Cell(new Paragraph("\n\n\n\n\t\t\t\t\t(盖章)   年 月 日\n\n\n",fontChinese));
		cell.setVerticalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setHorizontalAlignment(com.lowagie.text.Cell.ALIGN_CENTER);
		cell.setColspan(4);
		table.addCell(cell);
		document.add(table);
		// 在表格末尾添加图片
		Image png=Image.getInstance(ServletActionContext.getServletContext().getRealPath("")+ "/png-0662.png");
	    document.add(png);
		// 分页
	    document.newPage();
		document.close();
	}
	public String exportword(){
		String eMname="李小明";
		String eMsex="男";
		int eMage=25;
		String eMduty="经理"; 
		Double eMpay=2580.78;
		String eMpolity="党员";
		String eMaddress="天津市清河县大柳营镇";
	
		try {
			String newFilePath1 = getNewFilePath();
			createWord(eMname,eMsex,eMage,eMduty,eMpay,eMpolity,eMaddress);
			writeNewFile(newFilePath1, filename);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       return null;
	}
	/**
	 * 功能:将数据库中的数据导出excel
	 * 日期:2012-3-20	 */
	public String exportexcel(){
		getResponse().setContentType("application/vnd.ms-excel");
		File f1 = null;
		//得到服务器路径
		String path = getRequest().getSession().getServletContext().getRealPath("")+File.separator;
		//文件名生成
		String filename="temp";
		filename=System.currentTimeMillis()+".xls";
		File f = new File(path+"Book2.xlt");// 定义一个模板,放在服务器相应路径下.

		Workbook workbook = null;
		WritableWorkbook writableWorkbook = null;
		String workwheet="工作表名";
		try {
			/**
			 * 使用文件输入输出流读取Excel模板,重新写入新文件,就是为了读到其EXCEL格式.
			 * 所以在服务器相应文件,必须有一个空Excel文件,如:Book1.xls
			 */
			FileInputStream fis = new FileInputStream(f);
			byte[] b = new byte[fis.available()];
			fis.read(b);
			fis.close();
			f1 = new File(path+filename);
			FileOutputStream fos = new FileOutputStream(f1);
			fos.write(b);
			fos.close();

			workbook = Workbook.getWorkbook(f1);
			ServletOutputStream os = getResponse().getOutputStream();
			//.createWorkbook(os, workbook);
			writableWorkbook = Workbook.createWorkbook(f1);
			WritableSheet ws = writableWorkbook.getSheet(0);
			
            //添加第四个工作表
			WritableSheet sheet = writableWorkbook.createSheet(workwheet,4); 

			//定义样式:包括字体样式
			WritableFont wf1 = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);
			WritableCellFormat wcf1 = new WritableCellFormat(wf1);
			//背景样式
			wcf1.setBackground(Colour.YELLOW2);
			//对齐方式
			wcf1.setAlignment(Alignment.CENTRE);         
			wcf1.setVerticalAlignment(VerticalAlignment.CENTRE);
			
			WritableFont wf2 = new WritableFont(WritableFont.TIMES,11,WritableFont.NO_BOLD);; 
			WritableCellFormat wcf2 = new WritableCellFormat(wf2);
			wcf2.setAlignment(Alignment.CENTRE);
			//边框线设置
			wcf2.setBorder(Border.ALL,BorderLineStyle.THIN);
			
			WritableFont wf3 = new WritableFont(WritableFont.TIMES,12,WritableFont.BOLD);
			WritableCellFormat wcf3 = new WritableCellFormat(wf3);
			wcf3.setAlignment(Alignment.CENTRE);
			wcf3.setBorder(Border.ALL,BorderLineStyle.THIN);

			//显示数字形式
			NumberFormat wf5=new NumberFormat("#0.00");
			WritableCellFormat wcf5 = new WritableCellFormat(wf5);
			wcf5.setAlignment(Alignment.CENTRE);
			wcf5.setBorder(Border.ALL,BorderLineStyle.THIN);
			
            //添加带有formatting的DateFormat对象 
			DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss"); 
			WritableCellFormat wcfdf = new WritableCellFormat(df); 
			wcfdf.setAlignment(Alignment.CENTRE);
			wcfdf.setBorder(Border.ALL,BorderLineStyle.THIN); 
			
			//数字格式显示两位小数
			DecimalFormat dfformat = new DecimalFormat("###,##0.00"); 
            //输出表头
			Label l = null;
			int k = 0;
			//ws.mergeCells(0,k,7,k);		                    //合并单元格,表示合并第0行第0列到第0行第7列
            /**
             * 功能:下面5句实现在模板中任何单元格定义名称EM_name,通过findCellByName查找
             *      如果找到,则将获取标记单元格的位置,并将内容填入,找不到,不管.
             *      实现了程序充许可以任何定义有限范围的模板定义.
             * 日期:2008-2-28
             * 
             */
		    Cell cl=writableWorkbook.findCellByName("EM_name");  
		    if(cl!=null){
			//System.out.println(cl.getContents()+"找到了"+cl.getColumn()+"---"+cl.getRow());
			l = new Label(cl.getColumn(),cl.getRow(), "网通审计人员统计报表", wcf1);   //将内容填入
			ws.addCell(l); 
			ws.setRowView(k,700);   //设置单元格宽度,k表示行,500表示高度
			}	
		    
			k++;
			ws.mergeCells(0,k,1,k);
			l = new Label(0,k, "填报单位:", wcf3);
			ws.addCell(l);
			
			ws.mergeCells(2,k,5,k);
			l = new Label(2,k, "审计部一处", wcf3);
			ws.addCell(l);
			
			l = new Label(6,k, "日期:", wcf3);
			ws.addCell(l);
			
			//l = new Label(7,k, "2008-03-15", wcfdf);
			DateTime lt = new DateTime(7,k,new java.util.Date(),wcfdf);
			ws.addCell(lt);
			
			k++;
			l = new Label(0,k, "序号", wcf3);
			ws.addCell(l);
			l = new Label(1,k, "姓名", wcf3);
			ws.addCell(l);
			l = new Label(2,k, "性别", wcf3);
			ws.addCell(l);
			l = new Label(3,k, "年龄", wcf3);
			ws.addCell(l);
			l = new Label(4,k, "职务", wcf3);
			ws.addCell(l);
			l = new Label(5,k, "工资", wcf3);
			ws.addCell(l);
			l = new Label(6,k, "政治面貌", wcf3);			
			ws.addCell(l);
			l = new Label(7,k, "地址", wcf3);
			ws.addCell(l);
			ws.setColumnView(7,30);   //设置单元格宽度,7表示列,30表示宽度
			//输出内容
			List<Employeer> emlist=iemployeerService.getEmployeerAll("from Employeer");
			for(int i=0;i<emlist.size();i++)
			{
				k++;
				l = new Label(0,k, Integer.valueOf(emlist.get(i).getId()).toString(), wcf2);
				ws.addCell(l);
				l = new Label(1,k, emlist.get(i).getEm_name(), wcf2);
				ws.addCell(l);
				l = new Label(2,k, emlist.get(i).getEm_sex(), wcf2);
				ws.addCell(l);
				l = new Label(3,k, Integer.valueOf(emlist.get(i).getEm_age()).toString(), wcf2);
				ws.addCell(l);
				l = new Label(4,k, emlist.get(i).getEm_duty(), wcf2);
				ws.addCell(l);
				l = new Label(5,k, dfformat.format(emlist.get(i).getEm_pay()).toString(), wcf5);
				ws.addCell(l);
				l = new Label(6,k, emlist.get(i).getEm_polity(), wcf2);			
				ws.addCell(l);
				l = new Label(7,k, emlist.get(i).getEm_address(), wcf2);
				ws.addCell(l);
			}
			//添加图片,只支持png格式,注意在服务器启动时,第一次将png图片放进去,读取时是不显示的.需得启服务器.
			ws.mergeCells(5, 5, 6, 10);
			WritableImage wbi=new WritableImage(5, 5, 6, 10, new File(path+"png-0662.png"));
			ws.addImage(wbi);
			writableWorkbook.write();
			//得到工作表行数
			int cnt = ws.getRows();
            System.out.println("表行数有:"+cnt);
            //工作表某一单元格内容
            Cell cell = ws.getCell(0,0);
            System.out.println("0行0列内容是:" + cell.getContents());

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

			if (writableWorkbook != null)
				try {
					writableWorkbook.close();
				} catch (Exception e) {
					// Exception
				}
	
			if (f1.exists()) {
				f1.delete();
				System.out.println("文件已经删除!");
			} else {
				
				/*try {
					f1.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
				System.out.println("文件已经创建!");*/
			}
		}
      return null;
	}
	public BasicUtil getBasicUtil() {
		return basicUtil;
	}
	public void setBasicUtil(BasicUtil basicUtil) {
		this.basicUtil = basicUtil;
	}
	public FileService getFileService() {
		return fileService;
	}
	public void setFileService(FileService fileService) {
		this.fileService = fileService;
	}
	public IemployeerService getIemployeerService() {
		return iemployeerService;
	}
	public void setIemployeerService(IemployeerService iemployeerService) {
		this.iemployeerService = iemployeerService;
	}
	public Employeer getEmployeer() {
		return employeer;
	}
	public void setEmployeer(Employeer employeer) {
		this.employeer = employeer;
	}
}

 

posted @ 2012-03-20 00:10  死靈天使  阅读(558)  评论(0编辑  收藏  举报