java 操作Excle(数据的导出、导入)

/**导出分组excle文件表头*/
public static final List<String> TEMPLET_HEAD = Arrays.asList("姓名","年龄","性别","手机号","注册时间",
"职业","毕业院校","爱好","备注");
private static final String SHEET_NAME="组织数据";
private static final int NUMBER_ZERO = 0;
/** 导入阀值 */
private static final int THRESHOLD = 500;
/**
* excel导出数据
* @param response
* @param string
* @param string2
* @param arrayList
*/
public void export2Excel(HttpServletResponse response, List<Map<String,Object>> list) {
/** 第一步,创建一个webbook,对应一个Excel文件 */
final HSSFWorkbook wb = new HSSFWorkbook();
/** 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet */
final HSSFSheet sheet = wb.createSheet(SHEET_NAME);
/** 设置列宽 */

for (int i = 0; i < TEMPLET_HEAD.size(); i++) {
sheet.setColumnWidth(i, 6000);
if(i==TEMPLET_HEAD.size()-1){
sheet.setColumnWidth(i, 23500);
}
}

wb.setSheetName(0, SHEET_NAME);
/** 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short */
HSSFRow row = sheet.createRow(0);
/** 给表头命名 */
for (int i = 0; i < TEMPLET_HEAD.size(); i++) {
createHeadCell(row, i, TEMPLET_HEAD.get(i), wb, TEMPLET_HEAD.size());
}
/** 在sheet中添加表头第1行,数据示例 */
row = sheet.createRow(1);
/** 添加数据 */
createCell(row,list, wb,sheet);




/** 导出excel */
try {
response.setContentType("application/msexcel");
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(SHEET_NAME.getBytes(), "ISO-8859-1")+" "+DateUtil.toString(new Date())+ ".xls");
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}

}
/**
 * 将list集合中的数据添加到sheet中
 * @param row
 * @param list
 * @param wb
 * @param sheet
 */
private void createCell(HSSFRow row,List<Map<String,Object>> list,HSSFWorkbook wb,HSSFSheet sheet) {
        HSSFCell cell = null;                                    //Excel的列
/** 创建一个居中格式 */
        final HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
/** 设置字体 */
final HSSFFont font = wb.createFont();
font.setFontName("宋体");
font.setFontHeightInPoints((short) 11);
style.setFont(font);
        
for (int i = 0; i < list.size(); i++) {
Map<String,Object> map = list.get(i);
            row = sheet.createRow((short) (i + 1));//创建第i+1行
            row.setHeight((short)400);//设置行高
            if(map.get("name") != null){
                cell = row.createCell(0);//创建第i+1行第0列
                cell.setCellStyle(style);//设置风格
                cell.setCellValue(String.valueOf(map.get("name")));//设置第i+1行第0列的值
            }
            if(map.get("age") != null){
                cell = row.createCell(1);//创建第i+1行第1列
                cell.setCellStyle(style);//设置风格
                cell.setCellValue(String.valueOf(map.get("age")));//设置第i+1行第1列的值
            }
            if(map.get("sex") != null){
                cell = row.createCell(2);//创建第i+1行第2列
                cell.setCellStyle(style);//设置风格
                cell.setCellValue(String.valueOf(map.get("sex")));//设置第i+1行第2列的值
            }
            if(map.get("mobile") != null){
                cell = row.createCell(3);//创建第i+1行第3列
                cell.setCellStyle(style);//设置风格
                cell.setCellValue(String.valueOf(map.get("mobile")));//设置第i+1行第3列的值
            }
            if(map.get("CREATEDDATE") != null){
                cell = row.createCell(4);//创建第i+1行第4列
                cell.setCellStyle(style);//设置风格
                cell.setCellValue(String.valueOf(map.get("CREATEDDATE")));//设置第i+1行第4列的值
            }
            if(map.get("job") != null){
                cell = row.createCell(5);//创建第i+1行第5列
                cell.setCellValue(String.valueOf(map.get("job")));//设置第i+1行第5列的值
                cell.setCellStyle(style);//设置风格
            }
            if(map.get("school") != null){
                cell = row.createCell(6);//创建第i+1行第6列
                cell.setCellStyle(style);
                cell.setCellValue(String.valueOf(map.get("schoolers")));//设置第i+1行第6列的值
            }
            if(map.get("hobby") != null){
                cell = row.createCell(7);//创建第i+1行第7列
                cell.setCellStyle(style);
                cell.setCellValue(String.valueOf(map.get("hobby")));//设置第i+1行第7列的值
            }
}




}
/**
* 给row行count列赋值

* @param row
*            行
* @param count
*            第几列
* @param headerName
*            列名
* @param wb
*            webbook
*/
private void createHeadCell(final HSSFRow row, final int count,
final String headerName, final HSSFWorkbook wb, int size) {
/** 创建一个居中格式 */
final HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setWrapText(true);
/** 设置字体 */
final HSSFFont font = wb.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 12);
if(size-1 == count){
font.setColor(HSSFColor.RED.index);
}
style.setFont(font);

final HSSFCell cell = row.createCell(count);
cell.setCellValue(headerName);
cell.setCellStyle(style);
}




//excle导入数据
@RequestMapping(value = "importUser")
public String importUserGroupInfo(HttpServletRequest request,
ModelMap model) throws Exception {
Logger.INFO("uploadUserInfo------------------>begin");
request.setCharacterEncoding("utf-8");




final MultipartFile mf = getInputStreamOfMr((MultipartHttpServletRequest) request);
final InputStream is = mf.getInputStream();
String logName=mf.getOriginalFilename();

String imgh=logName.substring(logName.lastIndexOf("."),logName.length());
if(!".xls".equals(imgh) && !".xlsx".equals(imgh)){
model.put("Status", "0");
model.put("message", "文件有误");
}else{
final HSSFSheet sheet = getFirstSheet(is);
final List<Map<String, Object>> importList = extractImportList(sheet);
final List<User> dtoList = getImportList(importList);
// 查询用户
List<String> list = mobileAppCfgGroupService.findUserIdAll();
if(list != null && list.size() > 0){
//要添加的或修改的集合对象
List<UserFrends> saveDtoList = new ArrayList<UserFrends>();


for(User dto : dtoList){
//用户是否存在
if(CommonUtil.isNotNull(dto.getUserId()) && list.contains(dto.getFrendId())){
//将要操作的对象放入要操作的集合中
saveDtoList.add(dto);
}
}
updateOrSaveImportList(request, saveDtoList);
}else{
model.put("Status", "0");
model.put("message", "没有分组信息");
}

}
Logger.INFO("uploadUserInfo------------------> end!!");
return queryUserGroupInfoList(request,model);
}
/**
* 数据保存

* @param request
* @param dtoList
* @throws BusinessServiceException 
*/
private void updateOrSaveImportList(final HttpServletRequest request,
final List<User> dtoList) throws BusinessServiceException {
List<User> toInsertList = new ArrayList<User>();
for (final User user : dtoList) {

String id = userGroup.getUserId();
boolean existFlag = false;
if(CommonUtil.isNotNull(id)){
//  调用修改函数
userService.updateUserId(user);
Logger.INFO("修改excle数据");
existFlag = true;
}

if(!existFlag){
toInsertList.add(user);
}
}
if(toInsertList != null && toInsertList.size()>0){
//  调用添加函数
for (User user : toInsertList) {
userService.addUserGroupRelation(user);
Logger.INFO("添加用户数据");
}
}
}

/**
* 获得request第一个上传的文件

* @param mr
*            MultipartHttpServletRequest
* @return
* @throws Exception
*             exception
*/
private MultipartFile getInputStreamOfMr(
final MultipartHttpServletRequest mr) throws Exception {
final Map<String, MultipartFile> map = mr.getFileMap();
final Iterator<Map.Entry<String, MultipartFile>> i = map.entrySet()
.iterator();
final Entry<String, MultipartFile> e = i.next();
return e.getValue();
}
/**
* 获得第一个sheet页

* @param is
*            文件流
* @return
* @throws Exception
*             exception
*/
private HSSFSheet getFirstSheet(final InputStream is) throws Exception {
final HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
final HSSFSheet sheet = hssfWorkbook.getSheetAt(NUMBER_ZERO);




return sheet;
}
/**
* 提取导入数据

* @param sheet
*            sheet页
* @return
* @throws Exception
*             exception
*/
private List<Map<String, Object>> extractImportList(final HSSFSheet sheet)
throws Exception {
HSSFRow hssfRow = null;
HSSFCell hssfCell = null;




/** 当大于阀值时 按阀值读取数据 */
final int lastRowNum = sheet.getLastRowNum() - 1 <= THRESHOLD ? sheet
.getLastRowNum() : THRESHOLD + 1;




final List<Map<String, Object>> resultMap = new ArrayList<Map<String, Object>>(
lastRowNum);
for (int rowNum = 1; rowNum <= lastRowNum; rowNum++) {
hssfRow = sheet.getRow(rowNum);
if (hssfRow == null || isBlank(hssfRow))
continue;




final Map<String, Object> data = new HashMap<String, Object>();
hssfCell = hssfRow.getCell(0);
data.put("sex", (String) getCellValue(hssfCell));
hssfCell = hssfRow.getCell(1);
data.put("userId", (String) getCellValue(hssfCell));
hssfCell = hssfRow.getCell(5);
data.put("name", (String) getCellValue(hssfCell));
resultMap.add(data);
}




return resultMap;
}
/**
* 是否存在空行

* @param hssfRow
*            行
* @return
*/
private boolean isBlank(final HSSFRow hssfRow) {
final int cell = 3;
boolean flag = true;
for (int i = 0; i < cell; i++) {
final HSSFCell hssfCell = hssfRow.getCell((i));
final String cellValue = (String) getCellValue(hssfCell);
if (CommonUtil.isNotNull(cellValue)) {
flag = false;
break;
}
}
return flag;
}
/**
* 取得单元格的值

* @param cell
*            列
* @return value

* formatValue

* yyyy-MM-dd----- 14

* yyyy年m月d日--- 31

* yyyy年m月------- 57

* m月d日 ---------- 58

* HH:mm----------- 20

* h时mm分 ------- 32

* yyyy-MM-dd HH:mm:ss -----189
*/
private Object getCellValue(final HSSFCell cell) {
if (cell == null)
return "";




Object value = null;




switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue().trim();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
final short format = cell.getCellStyle().getDataFormat();
DateFormat sdf = null;
if (format == 14 || format == 31 || format == 57 || format == 58) {
sdf = new SimpleDateFormat("yyyy-MM-dd");
value = sdf.format(cell.getDateCellValue());
} else if (format == 20 || format == 32) {
sdf = new SimpleDateFormat("HH:mm");
value = sdf.format(cell.getDateCellValue());
} else if (HSSFDateUtil.isCellDateFormatted(cell) || format == 189) {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
value = sdf.format(cell.getDateCellValue());
} else {
NumberFormat nf = new DecimalFormat("#");
value = nf.format(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue()).trim();
break;
}




return value;
}
private List<User> getImportList(
List<Map<String, Object>> importList) {
final List<User> doList=new ArrayList<User>(importList.size());
for (int i = 0; i < importList.size(); i++) {
final Map<String, Object> map = importList.get(i);
final User user=new User();
user.setName((String)map.get("name"));
user.setUserId((String)map.get("userId"));
user.setSex((String)map.get("sex"));
doList.add(userGroup);
}

return doList;
}
备注:有版本差异2.5的版本有中文乱码的需要设置,设置单元格时需要用short类型,3.8的版本不存在中文乱码设置单元格用int类型的。主要差距在Excle导出的数据中用筛选2.5不支持导入,读取不了筛选过的Excle。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值