今天继续昨天未完成工作,已经完工。
下面总结下我遇到的问题
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.youkuaiyun.com/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