springMVC导入报表,uuid使用,poi解析导入MySQL

今天继续昨天未完成工作,已经完工。

下面总结下我遇到的问题

1.使用springMVC上传文件,获得流以及条件,代码如下,

jsp部分代码

<h1>Please upload a file</h1>  
<!--   enctype(编码格式)必须为multipart/form-data  -->  
        <form method="post" action="../manager/test.do" enctype="multipart/form-data">  
            <input type="text" name="name"/>  
            <input type="file" name="file"/>  
            <input type="submit"/>  
        </form>  
        
    
java后台接收代码

/**
	 * @Title: test
	 * @Description: TODO 初始化员工信息
	 * @author wuxiaolong
	 */
	@RequestMapping(value = "/test",method = RequestMethod.POST)
	public ModelAndView initStaffInfo(@RequestParam("file") MultipartFile myfile, HttpServletRequest request){
		System.out.println("进入");
		return viewReportAssessmentOrderService.initUploadStaff(myfile ,request);
	} 
需要注意的是

①@RequestParam注解 要加上,否则获取不到参数

②要修改servlet-context.xml,加上

    <!--  这里申明的id必须为multipartResolver  -->  
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
      
        <!-- one of the properties available; the maximum file size in bytes -->  
        <property name="maxUploadSize" value="100000"/>  
    </bean>  

CommonsMultipartResolver允许设置的属性有:
    defaultEncoding:表示用来解析request请求的默认编码格式,当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding。
    uploadTempDir:设置上传文件时的临时目录,默认是Servlet容器的临时目录。
    maxUploadSize:设置允许上传的最大文件大小,以字节为单位计算。当设为-1时表示无限制,默认是-1。
    maxInMemorySize:设置在文件上传时允许写到内存中的最大值,以字节为单位计算,默认是10240。

这篇文章写的很好http://haohaoxuexi.iteye.com/blog/1188116

附送jsp上传的demo    http://blog.csdn.net/lookthesea/article/details/1617633

2.poi解析合并单元格,兵获取它的值

由于合并单元格后,假设为A1-A5为合并后的单元格,此时可以获取A1的值,但A2-A5的值为null

我写了一个方法,自动判断单元格是否为合并的并返回它实际的值,参考代码,

下面代码中首先通过最后一个方法得到

List<CellRangeAddress> rangeList
,int i 是读取的行数。

/**
	 * @Title: 获得单元格的值,如果是合并单元格的话有相应处理
	 * @Description: TODO
	 * @author wuxiaolong
	 * @param sheet
	 * @param rangeList
	 * @param i
	 * @return
	 */
	public String getRangeValue(Sheet sheet,List<CellRangeAddress> rangeList,int i){
			Boolean flag=this.isCombineCell(rangeList, sheet.getRow(i).getCell(1), sheet);
			if(flag){
				return this.getMergedRegionValue(sheet, i,1);
			}
			return null;
			
	}

/**
	* 判断单元格是否为合并单元格
	* 
	* @param listCombineCell
	*            存放合并单元格的list
	* @param cell
	*            需要判断的单元格
	* @param sheet
	*            sheet
	* @return
	*/
	public  Boolean isCombineCell(List<CellRangeAddress> listCombineCell,
	Cell cell, Sheet sheet) {
		int firstC = 0;
		int lastC = 0;
		int firstR = 0;
		int lastR = 0;
		
		for (CellRangeAddress ca : listCombineCell) {
			// 获得合并单元格的起始行, 结束行, 起始列, 结束列
			firstC = ca.getFirstColumn();
			lastC = ca.getLastColumn();
			firstR = ca.getFirstRow();
			lastR = ca.getLastRow();
			if (cell.getColumnIndex() <= lastC&& cell.getColumnIndex()>= firstC) {
				if (cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
					return true;
			}
				}
		}
			return false;
		}



/**
	 * @Title: 获取合并单元格的值 
	 * @Description: TODO
	 * @author wuxiaolong
	 * @param sheet
	 * @param row
	 * @param column
	 * @return
	 */
	public String getMergedRegionValue(Sheet sheet, int row, int column) { 
		int sheetMergeCount = sheet.getNumMergedRegions(); 
		for (int i = 0; i < sheetMergeCount; i++) { 
			CellRangeAddress ca = sheet.getMergedRegion(i); 
			int firstColumn = ca.getFirstColumn(); 
			int lastColumn = ca.getLastColumn(); 
			int firstRow = ca.getFirstRow(); 
			int lastRow = ca.getLastRow(); 

			if (row >= firstRow && row <= lastRow) { 
				if (column >= firstColumn && column <= lastColumn) { 
					Row fRow = sheet.getRow(firstRow); 
					Cell fCell = fRow.getCell(firstColumn); 

					return getCellFormatValue(fCell); 
				} 
			} 
		} 

		return null; 
	}



/** 
	  * 合并单元格处理,获取合并行 
	  * @param sheet 
	  * @return List<CellRangeAddress> 
	  */  
	  public List<CellRangeAddress> getCombineCell(Sheet sheet)  
	  {  
	    List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();  
	    //获得一个 sheet 中合并单元格的数量  
	    int sheetmergerCount = sheet.getNumMergedRegions();  
	    //遍历合并单元格  
	    for(int i = 0; i<sheetmergerCount;i++)   
	    {  
	      //获得合并单元格加入list中  
	      CellRangeAddress ca = sheet.getMergedRegion(i);  
	      list.add(ca);  
	    }  
	    return list;  
	  }  

3.我在java后台生成一个uuid序列号,如果要存入的字段在数据库中是主键,那么uuid会自动改写,就是你在java后台获得的不是实际存入数据库的,这时如果有外键关联的话,先生成uuid,然后使用dao.add(entity);返回entity.getUUID即可,再操作关联字段。

uuid关键代码

本来搜到一个很不多的文章,没收藏,大家自己百度吧,很多

mysql 里面可以用uuid()语句来生成一个UUID:

select uuid();
或 select replace(uuid(), '-', '');

直接在insert语句中插入UUID作主键的用法(简便):

insert into Price( Name, UUID, Price, BID) values('FEIFEI_TEST', uuid(), 32, 3);

 

UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。
  UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft’s Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。
  是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字
  UUID由以下几部分的组合:
  (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
  (2)时钟序列
  (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
  UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。
  使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。
  通用惟一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球惟一标识符(GUID),这也是通用惟一标识符的一种类型,可用来指向组建对象模块对象和其他的软件组件。第一个通用惟一标识符是在网罗计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件。
以上摘自http://baike.baidu.com/view/1052579.htm



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值