您的位置:首页 > 编程语言 > Java开发

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

2016-04-18 17:56 645 查看
/**导出分组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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: