`
zhuhongmingzhm
  • 浏览: 33525 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Struts中利用Jxl对Excel的导入导出

阅读更多
需求:  1,提供客户填写数据的EXCEL模板下载. 2,对客户上传的EXCEL中的数据进行效验
技术:  1,Struts做web的表示层,提供上传,下载 2,利用jxl 对 EXCEL 进行操作.
代码:  EXCEL模板的实现.

一,struts中的action提供模板下载:action
/**
 * 模版下载页面
 * */
public class ExportTemplateAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		javax.servlet.http.HttpSession session=request.getSession();
		HMITSession hmitsession= (HMITSession)session.getAttribute("hmitsession");
		//获取企业代码,业务规则,用于设置文件目录
		String entCode=hmitsession.getEntCode();
		//设置文件路径,业务规则设置了存于服务器上的文件路径
		File templateFile = new File(AppConst.getDownloadFileDirectory(entCode)+File.separator+"Template.xls");
		
		if(!templateFile.exists()){
			//设置excel的标题,假设只有一行标题
			String []titles={"司机编号(必填)","司机名称(必填)","驾照","身份证","手机"};
			//设置sheet名称
			String sheetName="司机数据";
			//获取excel文件
			templateFile=Util.getExcel(templateFile, sheetName, titles);
		}	
		//写入response
		Util.downLoadData(response, templateFile, "Template.xls");
		return null;
	}





  二,获取EXCEL文件的工具类
public class Util {
         /**
		 * @param  需要校验的字符串
		 * @return  true为null,false 为非null
		 * */
		public static boolean checkNull(String temp){
			return temp==null ? true:false;
		}
		/**
		 * @param temp
		 * @return 将null 返回为"";
		 * */
		public static String notNull(String temp){
			return checkNull(temp)? "": temp;
		}


		
		/**
		 * 创建一个规定格式的excel,第一行为标题行,每个标题为一个cell
		 * @param templateFile 一个文件
		 * @param sheetName excel的sheet的名字
		 * @param titles 标题列
		 * */
		public static File getExcel(File templateFile,String sheetName,String []titles)  throws Exception{
			//根据现有文件创建一个可写excel
			WritableWorkbook ww = Workbook.createWorkbook(templateFile);
/**在这里可以设置编码格式
		WorkbookSettings setting=new WorkbookSettings();
		java.util.Locale locale = new java.util.Locale("zh","CN");  
		setting.setLocale(locale);
		setting.setEncoding("UFT-8");
		*/
           //创建一个可写的sheet文件createSheet(sheetName,0),sheet名称,0代表第几个sheet
			WritableSheet ws =ww.createSheet(sheetName,0);
			//字体设置
			WritableFont arial10ptBold = new WritableFont (WritableFont.ARIAL, 10, WritableFont.NO_BOLD);
			arial10ptBold.setColour(Colour.RED);
			//设置格式,这里可以根据不同需要,设置多个格式,需要WritableFont进行构造
			WritableCellFormat arial10BoldFormat = new WritableCellFormat (arial10ptBold);
            //这里可以设置字体对齐方式等等
            arial10BoldFormat .setAlignment(jxl.format.Alignment.CENTRE);	
		    //定义单元格
			Label  cell= null;
/**合并单元格
		ws.mergeCells(0, 0, 8, 0);
		cell=new Label(0,0,"产品信息",fontCenter);
		ws.addCell(cell);
		*/
			
			for (int i = 0; i < titles.length; i++) {
//第一个参数为列,第二个参数为行,第三个参数为cell的内容,第四个为字体的格式
				cell=new Label(i,0,titles[i],arial10BoldFormat);
				ws.addCell(cell);
			}
			ww.write();//写入到当前文件
			ww.close();
			ww=null;
			return templateFile;

		}
	
	}
/**
	 * 下载设置
	 * */
	public static  void downLoadData(HttpServletResponse response,File returnFile,String uploadedFileName){
		response.setHeader("Content-disposition","attachment; filename="+uploadedFileName);
		response.setHeader("Content-Type", "application/octet-stream");
		
		BufferedInputStream bis = null;//读excel
		BufferedOutputStream bos = null;//输出
		
		try{
			//读取excel文件
			bis = new BufferedInputStream(new FileInputStream(returnFile));
			//写入response的输出流中
			bos=new java.io.BufferedOutputStream(response.getOutputStream());
			byte[] buff = new byte[2048];/*设置缓存*/
			int bytesRead;
			while(-1!= (bytesRead = bis.read(buff, 0, buff.length))){
				bos.write(buff, 0, bytesRead);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if (bis != null)
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if (bos != null)
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

  三,文件上传
public class ExportAction extends Action {

	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		HttpSession session= request.getSession();
        HMITSession hmitsession= (HMITSession)session.getAttribute("hmitsession");
		
		//用户上传数据信息是否正确的标志位
		boolean flag=true;
		
		ChauffeurExportForm cef=(ChauffeurExportForm) form;
		/**
		 * 获取提交表单信息
		 * */
		//获取上传文件
		InputStream uploadedFileStream =cef.getUploadFile().getInputStream();
		String ansy = ChauffeurUtil.notNull(request.getParameter("asynchronism"));/*如果需要开启多线程处理 则为1*/
        String email= ChauffeurUtil.notNull(request.getParameter("emailAddress"));/*开启线程发送邮件*/
        
        //上传文件名称
		String fileName=getTempExcelName(cef.getUploadFile().getFileName());
		//写入上传文件夹目录+名称
		String uploadedFileName=AppConst.getUploadFileDirectory(hmitsession.getEntCode())+File.separator+fileName;
		//获取到excel对象
		Workbook workbook = Workbook.getWorkbook(uploadedFileStream);
		//将上传文件放置上传文件目录中
		writeExcel(workbook,uploadedFileName);
		
		//写入文件
		File returnFile = new  File(AppConst.getUploadTempDirectory(hmitsession.getEntCode())+File.separator+fileName);
		//写入临时文件
		WritableWorkbook rww = Workbook.createWorkbook(returnFile,workbook);
		//从临时文件中取得sheet
		Sheet sheet= workbook.getSheet(0);
		//设置字体
		WritableFont arial10ptBold = new WritableFont (WritableFont.ARIAL, 10, WritableFont.NO_BOLD);
		arial10ptBold.setColour(Colour.RED);//红色错误字体
		WritableCellFormat arial10BoldFormat = new WritableCellFormat (arial10ptBold);
		
		/**
		 * 以下为业务判断和操作
		 * Label为一个单元格
		 * sheet.getRows 获取所有行
		 * rww.getSheet(0).addCell(cell) 将cell放入对应的sheet中
		 * 
		 * 获取关系应为  sheet(index) -->sheet(index).getCell(col,row);
		 * */
		Label  cell= null;
		StringBuffer error=new StringBuffer("");
		for (int i = 0; i <sheet.getRows() ; i++) {
			error.delete(0, error.length());
			String chauffeurNo=sheet.getCell(0, i).getContents();
			String chauffeurName=sheet.getCell(1, i).getContents();
			if(chauffeurNo.equals("")){
				cell=new Label(8,i,error.append("~司机编号没有填写").toString(),arial10BoldFormat);
				rww.getSheet(0).addCell(cell);
				flag=false;
			}
			if(chauffeurName.equals("")){
				cell=new Label(8,i,error.append("~司机名称没有填写").toString(),arial10BoldFormat);
				rww.getSheet(0).addCell(cell);
				flag=false;
			}
			
		}
		// -------------------------------------若干业务逻辑操作省略
		uploadedFileStream.close();
		uploadedFileStream=null;
		rww.write();	
		rww.close();
		rww=null;
		//记录日志
		if(flag) Util.setLog(request,hmitsession,"wms_car_dirver_add","司机批量新增");
		//异步
		if(ansy.equals("1")){
			//异步处理
			AsynchronousHandle thread = new AsynchronousHandle(this.getServlet().getServletContext(),
												email,returnFile,flag,uploadedFileName);
			thread.start();
		}else{
			//同步处理
			if(flag){//无错误
				request.setAttribute("flag", "1");
    			request.setAttribute("msg", "更新顺利完成");
			}else{//出现错误数据
				request.setAttribute("flag", "2");
    			request.setAttribute("msg", "上传的数据有错误!请检验核对后再次进行上传");
    			//设置下载
    			Util.downLoadData( response,returnFile , cef.getUploadFile().getFileName());
    			return null;
			}
		}
		
		return null;
	}
	
	public static String getTempExcelName(String excelName){
		String time = HMITStr.encodeHTML(new Date(),"yyyyMMddHHmmssSS");//获取服务器时间
		int posi = excelName.lastIndexOf(".");
		String fileName=excelName.substring(0,posi)+time+excelName.substring(posi);
		return fileName;
	}
	
	public static void writeExcel(Workbook workbook,String uploadedFileName) throws Exception, IOException{
		WritableWorkbook ww = Workbook.createWorkbook( new File(uploadedFileName),workbook);
		ww.write();
		ww.close();
		ww=null;
	}

}
分享到:
评论
1 楼 18335864773 2017-06-30  
有机会试试pageoffice生成excel。PageOffice支持多种Web编程语言及架构,有:Java(JSP、SSH、MVC等),ASP.NET(C#、VB.NET、MVC、Razor等),PHP,ASP。pageoffice可以在网页里在线编辑Office文档,也可以后台代码读写Office文档里的内容。而poi和jxl只能读写office文档里面的内容。

相关推荐

    struts2整合apache的jxl导入导出excel表格

    Struts2 框架与 Apache 的 JXL 库整合,可以方便地实现在 Java Web 应用中导入和导出 Excel 表格的功能。Apache JXL 是一个强大的 Java 库,专门用于读写 Microsoft Excel 文件,使得开发者无需依赖 Office API 就能...

    struts2 poi,jxl向excel表中插入记录源代码

    这个项目的核心功能是允许用户通过前端界面提交数据,然后这些数据会被Struts2的Action处理,并使用POI或JXL库写入到指定的Excel文件中。为了实现这一功能,你需要理解以下几个关键知识点: 1. **Struts2 Action**:...

    jxl 实现的数据库导入导出

    使用了hibernate+struts1+spring + MYSql数据库 能够将数据库整张表的数据导出到excel...也能将excel 的数据导入 到空的 数据库表中。 能够保证导出的数据类型不变。 如要正确运行,必须先执行src 下的backup.sql 脚本

    Java web 数据库数据与excel表格形式导入导出.docx

    在实际应用中,Java Web 数据库数据与 Excel 表格形式导入导出技术可以广泛应用于各种业务系统,例如企业财务管理系统、人力资源管理系统、客户关系管理系统等。该技术可以帮助企业更好地管理和分析数据,提高工作...

    jxl从数据库导出到excel工具包

    **标题解析:**"jxl从数据库导出到excel工具包" ...以上就是关于"jxl从数据库导出到excel工具包"的相关知识点,包括jxl库的使用、与数据库操作的结合、在MVC框架下的应用,以及在实际开发中需要注意的各个层面。

    struts2+jxl图片上传,io流

    结合jxl库,我们可以处理Excel文件,这在数据导入导出、报表生成等场景中非常有用。 首先,我们需要在Struts2项目中配置文件上传支持。这通常涉及修改`struts.xml`配置文件,添加`struts.multipart.parser`属性设置...

    ssh整合web导出excel案例

    在这个案例中,我们将不依赖于像Apache POI或jxl这样的第三方库来生成Excel,而是利用Java的I/O流来实现。 1. **不使用第三方库导出Excel**: 在这个示例中,开发者选择不使用如Apache POI这样的专门处理Excel的库...

    struts2+poi+jxl

    Struts2是一个基于MVC(Model-View-...综上所述,结合Struts2、POI和JXL,我们可以构建出强大的数据导入导出功能,以及动态生成和下载Excel报表的Web应用。这对于数据驱动的业务来说,提供了极大的便利性和灵活性。

    jxl报表 代码应用

    【描述】"jxl实现的SSH架构的经典报表范例程序"指的是一个具体的应用实例,它演示了如何利用jxl库在基于SSH(Struts作为MVC框架、Hibernate作为ORM工具、Spring作为依赖注入容器)的企业级应用中生成和读取Excel报表...

    java数据导入到Excel表

    在Struts2中,实现数据导出到Excel通常涉及到以下几个步骤: 1. **数据准备**:首先,需要准备要导出的数据,这通常是从数据库查询得到的结果集或业务逻辑处理后的数据列表。 2. **创建Excel工作簿**:使用JXL库中...

    java中excel数据写入数据库

    在Java编程中,将Excel数据写入数据库是一项常见的任务,特别是在数据处理和导入导出场景。这个场景通常涉及使用特定库来解析Excel文件,并通过某种框架(如Struts)与数据库进行交互。以下是对这个过程的详细解释:...

    JAVA导出excel文件2003版,结合具体框架的实现

    在企业级应用开发中,导出数据到Excel是一种常见的需求。本文将介绍如何使用Java来导出Excel 2003版本(.xls)文件,并结合具体的框架实现这一功能。该方法具有一定的局限性,但可以作为参考案例来了解如何处理此类...

    jxl.jar;dom4j.jar;jsonplugin-0.34.jar;junit-3.8.2.jar;log4j-1.2.14.jar;struts2-codebehind-plugin-2.0

    对于处理数据导入导出、报表生成等场景,jxl是Java开发者常用的工具。 2. **dom4j.jar**:这是一个强大的XML处理库,它支持DOM、SAX和StAX解析方式,并提供了一种简单易用的API来操作XML文档。通过dom4j,开发者...

    execl导出-execl导出

    在Java环境中实现Excel导出功能时,开发者通常会利用第三方库如JXL来简化文件的创建过程。此外,还需要考虑如何优雅地处理异常、配置日志记录机制等。本示例提供了一个完整的框架,涵盖了从查询数据到实际导出Excel...

    进销存系统

    另外,jxl库是Java处理Excel文件的工具,可能在这个进销存系统中用于数据导入导出功能。例如,管理员可能需要批量导入供应商信息或者导出销售报告,这时候jxl可以帮助程序读写Excel文件,实现数据的快速交换。 总的...

    SSH整合需要的所有JAR包(1部分).

    在SSH项目中,如果你需要从Excel导入数据或者生成Excel报告,这个库是必不可少的。 7. **freemarker.jar**:FreeMarker是一个模板引擎,用于生成文本输出,如HTML页面。在Struts中,FreeMarker通常作为视图层的技术...

    SSH整合所需的JAR包-2

    在SSH项目中,如果需要处理Excel数据导入导出,这个库将非常有用。 `jxl.jar`是另一个处理Excel的库,它提供了读写Excel文件的功能。与POI相比,jxl可能更简单易用,但在功能和性能上可能稍逊一筹。 `jboss-jmx....

    SSH开发使用的各种包

    在SSH项目中,可以用来生成报表或者导入导出数据,比如统计分析或用户数据导出。 7. freemarker-2.3.15.jar:FreeMarker是一个模板引擎,用于生成动态HTML或其他格式的文本。在Struts2中,可以配置FreeMarker作为...

    SSHJAR包part02

    在Java程序中,可以使用POI来生成、读取和修改这些文件,尤其在数据导入导出、自动化报表生成等方面非常有用。 3. **jxl.jar**:JXL是一个Java库,用于读写Excel文件。虽然POI提供了更全面的Excel处理功能,但在...

    java开发常用架包,sturts2,spring,json,druid架包

    在Java中,它们常用于数据导入导出,或者生成报告。 3. **MySQL** 和 **Oracle**:这些都是常见的关系型数据库管理系统。MySQL以其开源、轻量级和高效而被广泛使用,而Oracle则是大型企业级数据库的选择,提供了更...

Global site tag (gtag.js) - Google Analytics