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

flex 上传excel 导入数据库

阅读更多
flex 上传excel 导入数据库

前端用flex上传excel,因为此例子用的是flex3, 所以通过 servlet 进行处理(如果是flex4的话 可以用remoteobject处理),servlet 可以利用jxl 处理excel,并报存到数据库。

----------》前端代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="vertical" verticalAlign="middle" horizontalAlign="center">
	
	<mx:Style>
		global {
			fontSize : 12;
		}
	</mx:Style>
	
	<mx:Script>
		<![CDATA[
			
			private var file:FileReference = new FileReference();
			
			// 上传状态指示, 和下面的文本框绑定
			[Bindable]
			private var stateText:String = "请选择一个文件上传";
			
			// createChildren 比 creationComplete 事件更早发生, 省的注册事件侦听, 直接在这里写了
			protected override function createChildren():void {
				super.createChildren();
				file.addEventListener(Event.SELECT, file_select);
				file.addEventListener(Event.COMPLETE, file_complete);
				file.addEventListener(ProgressEvent.PROGRESS, file_progress);
			}
			
			// 选择 1 个文件的事件
			private function file_select (e:Event):void {
				stateText = "选择了文件 " + file.name;
			}
			
			// 上传完毕后的事件
			private function file_complete (e:Event):void {
				stateText = "上传完毕";
			}
			
			private function file_progress (e:ProgressEvent):void {
				stateText = "已上传 " + Math.round(100 * e.bytesLoaded / e.bytesTotal) + "%";
			}
			// 先判断一下文件大小, 再上传, FileService.aspx 就是上传地址
			private function upload ():void {
				if (file.size > 0) {
					stateText = "正在上传 " + file.name;
					var request:URLRequest = new URLRequest("http://localhost:8080/jxlDemo/uploadFile");
					file.upload(request);
				}
			}
			
			
		]]>
	</mx:Script>
	
	<mx:Panel width="250" height="112" layout="vertical" title="上传示例"
		verticalAlign="middle" horizontalAlign="center" >
		<mx:HBox>
			<mx:TextInput text="{stateText}" width="160" editable="false"/>
			<mx:Button label="浏览" click="file.browse();"/>
		</mx:HBox>
		<mx:HBox>
			<mx:Button label="上传" click="upload();"/>
		</mx:HBox>
	</mx:Panel>
</mx:Application>

----------》servlet代码
package com.xx;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

public class UploadFileServlet extends HttpServlet {
	
	private String createTableSql = "";// 创建数据库的sql
	private String colType = "varchar2(255)";// 字段类型
	private String key = "id";// 主键
	private String charSet = "utf8";// 表格字符类型
	private String ENGINE = "InnoDB";// 表格类型
	private String tableName = "tempExcelToH2";// 表名称
	private String colName = "col";// 默认字段名
	private Connection conn = null;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		ServletInputStream is = req.getInputStream();
		
//		int i = is.read();
//		while(i != -1){
//			System.out.print((char)i);
//			i = is.read();
//		}
        /*过滤HTTPHeader,否则jxl会报无法识别文件结尾的错误*/  
		byte[] junk = new   byte[1024];   

        for(int i = 0; i < 8; i++)   
        {   
        	 is.readLine(junk, 0,junk.length);   
        }  


		excelToDB(is);
	}
	
	private void excelToDB(InputStream is){
		try {
			jxl.Workbook rwb = Workbook.getWorkbook(is);
			Sheet rs = rwb.getSheet(0); // 读取第一个sheet
			int colNum = rs.getColumns();// 列数
			int rowNum = rs.getRows();// 行数
	
			System.out.println("colNum rowNum------------------" + rowNum + ","
					+ colNum);
			System.out.println("start create base-------------------------");
	
			getConntion();
	
			String tableSql = getCreateTableSql(rowNum, colNum);
			Statement st = conn
					.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
							ResultSet.CONCUR_UPDATABLE);
			st.execute(tableSql);
			st.close();
	
			System.out.println("create base end -------------------------");
	
			String sql = getColName(rowNum, colNum);
			PreparedStatement ps = null;
			String strValue = "";
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < rowNum; i++) {
				strValue = "";
				for (int j = 0; j < colNum; j++) {
					Cell c = rs.getCell(j, i);
					strValue = c.getContents();
					ps.setString(j + 1, strValue);
				}
				ps.addBatch();
			}
	
			ps.executeBatch();
			conn.commit();
	
			if (ps != null) {
				ps.close();
			}
	
			System.out.println(" insert end-------------------------");
			close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private String getCreateTableSql(int rowNum, int colNum) {
		// 可以做成可配置文件

		createTableSql = "create table " + tableName + "( `" + key
				+ "` bigint generated by default as identity, ";
		String temp = "";

		for (int j = 0; j < colNum; j++) {
			temp = temp + "`" + colName + j + "` " + colType + " DEFAULT NULL,";
		}

		createTableSql = createTableSql + " " + temp + " PRIMARY KEY (`" + key
				+ "`)" + ");";

		return createTableSql;
	}

	private String getColName(int rowNum, int colNum) {
		// 可以做成可配置文件
		String colSql = "";
		String colValue = "";

		for (int j = 0; j < colNum; j++) {
			colSql = colSql + "`" + colName + j + "`,";
			colValue = colValue + "" + "?,";

		}

		return "insert into " + tableName + " ("
				+ colSql.substring(0, colSql.lastIndexOf(",")) + ")values("
				+ colValue.substring(0, colValue.lastIndexOf(",")) + ")";
	}

	private void getConntion() {

		try {
			String driver_class = "org.h2.Driver";
			String connection_url = "jdbc:h2:tcp://localhost/jxltest";
			String user_name = "sa";
			String db_password = "";

			Class.forName(driver_class);
			conn = DriverManager.getConnection(connection_url, user_name,
					db_password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void close() {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}	
}


其中就是jxl处理流时,必须先过滤http header,看到了个解决方案(http://blog.csdn.net/sdrzths/archive/2010/04/09/5467876.aspx)还是报jxl.read.biff.BiffException: Unable to recognize OLE stream 的错,其实解决是打印上传的excel ,发现结果是
------------ae0cH2Ef1Ij5Ij5ae0ei4ei4Ef1cH2
Content-Disposition: form-data; name="Filename"

users.xls
------------ae0cH2Ef1Ij5Ij5ae0ei4ei4Ef1cH2
Content-Disposition: form-data; name="Filedata"; filename="users.xls"
Content-Type: application/octet-stream

??à?±á

所以http 头应该是8行,得以解决。

感谢下面博主
Flex 利用 Blazeds上传文件 http://blog.csdn.net/chuangxin/archive/2010/09/13/5881758.aspx
如何在jsp中读取客户端的excel文件中的数据 http://blog.csdn.net/sdrzths/archive/2010/04/09/5467876.aspx
JXL读Excel文件到数据库
http://hi.baidu.com/liupeng_cn/blog/item/74140eef714e1cfcb2fb95cb.html
分享到:
评论
1 楼 果在随缘 2012-12-04  
项目怎么运行啊?

相关推荐

    flex excel智能比对导入数据功能

    "flex excel智能比对导入数据功能"是一个高效、智能的解决方案,它利用Java作为后台处理引擎,Flex作为前端用户界面,实现了从Excel文件中自动识别数据并将其准确地导入到数据库中的功能。以下是对这个功能的详细...

    flexDataGrid导入Excle案例

    本案例聚焦于“flexDataGrid导入Excel”的主题,它涉及到ActionScript(AS)编程语言如何与Excel文件进行交互。FlexDataGrid是Adobe Flex框架中的一个组件,用于展示和操作数据集,而Excel则是广泛使用的电子表格...

    flex的as3xls读写excel

    根据给定的信息,本文将详细解释Flex框架中利用as3xls库进行Excel文件读写的实现原理及具体步骤。 ### 一、as3xls简介 as3xls 是一个用于Adobe Flex和ActionScript 3项目的库,它允许开发人员轻松地创建、读取和...

    flex 3.0 actionscript 2.0

    4. **数据导入导出**:在Flex应用中,结合POI可以实现从Excel文件导入数据到数据库,或者将数据库结果导出为Excel文件,为用户提供方便的数据管理工具。 5. **性能优化**:POI 提供了流式处理API,如SXSSF,用于...

    报表设计器(flex+java+spring)

    用户可以导入现有的Excel模板,或导出设计好的报表为Excel格式,以便于分享、分析或进一步处理。 5. **数据逻辑处理**: 报表设计器不仅展示数据,还处理数据逻辑。这意味着它可以将从数据库获取的数据与用户在...

    Flex Data Grid Exporter

    CSV文件可以被多种程序读取,包括电子表格软件(如Microsoft Excel)和数据库管理系统。 4. **DataGridCSVExportExample.mxml**:这是一个MXML文件,它是Flex应用程序的主要源代码文件。这个例子可能展示了如何在...

    Dbunit数据库连接下载

    它可以将数据库状态定义为一种“数据集”,这种数据集可以是XML、CSV或者Excel格式的文件。这使得开发人员能够方便地创建和维护测试用例的数据环境,无论是在单元测试还是集成测试中都非常有用。 在描述中提到的...

    java web crm

    提供货物 分类,货物明细的数据维护,以及excel导入导出数据的功能。另提供填写销售单的货物价格,折扣,数量自动换算等细节功能。 系统设置模块: 提供明确到增删改查的权限功能。提供数据库备份,恢复功能。提供...

    非常经典java求职简历三套含项目介绍.pdf

    Struts中的Action作为控制层,Spring管理事务,而Jxl和JFreeChart分别用于数据导入和报表可视化。 以上就是从Java开发工程师的简历中提取出的关键知识点,涵盖了从基础语言到框架,再到实际项目经验的多个方面,...

    报表软件--Style Report报表数据填报

    - **数据源关联**:支持多种数据源的连接,包括但不限于数据库、文件系统等,实现异构数据源之间的表关联,从而实现多源填报的需求。 #### 四、数据处理灵活性 - **JavaScript数据结构调整**:用户可以通过...

    Data_Science_With_R_Workflow.zip

    1. 数据导入与预处理:R提供了多种库,如`readr`、`data.table`和`tidyverse`套件,用于读取各种格式的数据(如CSV、Excel、数据库等)。预处理包括清洗缺失值、异常值处理、数据类型转换以及数据整合,这通常使用`...

    vsFlexGrid Demo

    7. **导出和导入**:可以将数据导出到Excel或其他格式,也可以从外部文件导入数据,增强了数据交换的能力。 在提供的压缩包文件中,我们可以看到以下文件: - **FLEXHTML.BAS**:可能包含与`vsFlexGrid`相关的辅助...

    计算机科学与技术个人简历-模板.doc

    责任描述:使用 Silverlight 开发,包括 Excel 生成及导入、报告生成图形显示。 7. 基于 POF 的电子产品可靠性预计软件 项目描述:基于 POF 的电子产品可靠性预计软件。 开发环境:VS2008+SqlServer 2005。 责任...

    crystal_reports_2008 白皮书

    - 集成了Adobe Flex Builder,支持创建高级的Flex应用程序,并将Crystal Reports报表嵌入其中。 - 支持使用salesforce.com作为数据源,扩展了与云端服务的集成能力。 - **条形码与图形化元素**: - 支持Code 39...

    CrowBase:在CrowBase数据上在R中完成的工作

    这可能涉及到读取CSV、Excel(.xlsx)、数据库文件或其他格式。如果CrowBase是一个数据库,我们可能需要用到如`DBI`和`odbc`包来连接和查询数据。 2. **数据探索**:导入数据后,我们将进行初步的数据探索,了解...

    CL_BUD:论文数据分析

    在R中,我们可以使用`read.table()`或`read.csv()`函数从CSV文件中加载数据,或者使用`read_excel()`函数读取Excel文件。对于更复杂的文件格式,如SQL数据库,可以使用`dbConnect()`和`dbGetQuery()`等函数进行操作...

    Spring攻略(第二版 中文高清版).part2

    12.3 把现有项目导入SpringSource Tool Suite 491 12.3.1 问题 491 12.3.2 解决方案 492 12.3.3 工作原理 492 12.4 更快地构建更好的应用程序 493 12.4.1 问题 493 12.4.2 解决方案 494 12.4.3 工作...

    Spring攻略(第二版 中文高清版).part1

    12.3 把现有项目导入SpringSource Tool Suite 491 12.3.1 问题 491 12.3.2 解决方案 492 12.3.3 工作原理 492 12.4 更快地构建更好的应用程序 493 12.4.1 问题 493 12.4.2 解决方案 494 12.4.3 工作...

Global site tag (gtag.js) - Google Analytics