excel的导入导出

最近刚注册的博客园,也想记录一些学到的知识拿出来和大家分享一下。最近做一个项目有涉及到excel表格的导入导出,详细的代码如下:

public class ExcelUtils<T> {
private static final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd");

/**
* 导出excel文件
*
* @param title
* 表格的名称
* @param headers
* 表格的标题名
* @param list
* 要导出的实体集合
* @param out
* 输出地点
*/
public void exportExcel(String title, String[] headers, List<T> list,
OutputStream out) {
    HSSFWorkbook wb = new HSSFWorkbook(); // 创建一个工作簿
    HSSFSheet sheet = wb.createSheet(title); // 创建一个表格
    sheet.setDefaultColumnWidth((short) 15); // 设置默认列宽
    HSSFCellStyle style1 = setTitleStyle(wb.createCellStyle(),
    wb.createFont());
    HSSFCellStyle style2 = setContentStyle(wb.createCellStyle(),
    wb.createFont());
// 创建第一行,即标题栏
    HSSFRow row = sheet.createRow(0);
    for (int i = 0; i < headers.length; i++) {
    HSSFCell cell = row.createCell(i, HSSFCell.CELL_TYPE_STRING);
    cell.setCellStyle(style1);
    cell.setCellValue(headers[i]);
 }
    for (int i = 0; i < list.size(); i++) {
    T t = (T) list.get(i);
    row = sheet.createRow(i + 1);
    Field[] fields = t.getClass().getDeclaredFields();
    for (int j = 0; j < fields.length; j++) {
    HSSFCell cell = row.createCell(j);
    cell.setCellStyle(style2);
    String fieldName = fields[j].getName();
    String getMethodName = "get"
    + fieldName.substring(0, 1).toUpperCase()
    + fieldName.substring(1);
     try {
    Class tCls = t.getClass();
    Method getMethod = tCls.getMethod(getMethodName,
    new Class[] {});
    Object value = getMethod.invoke(t, new Object[] {});
    String textValue = null;
    if (value instanceof Date) {
    Date date = (Date) value;
    SimpleDateFormat sdf = new SimpleDateFormat(
   "yyyy-MM-dd");
   textValue = sdf.format(date);
   cell.setCellValue(textValue);
   } else {
  // 其它数据类型都当作字符串简单处理
   textValue = value.toString();
   cell.setCellValue(textValue);
 }
 } catch (Exception e) {
e.printStackTrace();
    }
   }
}
    try {
// 写进输出流中
   wb.write(out);
   } catch (IOException e) {
      e.printStackTrace();
   } finally {
    try {
    if (wb != null)
    wb.close();
}   catch (IOException e) {
     e.printStackTrace();
    }
   }
}

/**
*
* 描述:读取excel数据
* @param in 打开了excel文件的输入流,会自动调用close()方法。
* @return 返回字符串数组集合。一个数组下标对应一个单元格的数据,一个list对应一行数据。
*/
    public List<String[]> importExcel(InputStream in) {
    HSSFWorkbook wb = null;
    List<String[]> list = new ArrayList<String[]>();
    try {
       wb = new HSSFWorkbook(in);
    for (int i = 0; i < wb.getNumberOfSheets(); i++) {
    HSSFSheet sheet = wb.getSheetAt(i);
    for (int j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {
    HSSFRow row = sheet.getRow(j);
    int cellNum = row.getLastCellNum();
    String[] obj = new String[cellNum];
    for (int k = 0; k < cellNum; k++) {
    obj[k] = judgeType(row.getCell(k));
 }
   list.add(obj);
  }
 }
} catch (IOException e) {
     e.printStackTrace();
  } finally {
  try {
     wb.close();
     in.close();
 } catch (IOException e) {
     e.printStackTrace();
 }
}
   return list;
}

/**
*
* 描述:判断单元格数据类型
*
* @param cell
* 单元格
* @return 表格数据
*/
    String judgeType(HSSFCell cell) {
    String value = null;
    switch (cell.getCellType()) {
    case HSSFCell.CELL_TYPE_STRING:
    value = cell.getStringCellValue();
    break;
    case HSSFCell.CELL_TYPE_BLANK:
    value = cell.getStringCellValue();
    break;
    case HSSFCell.CELL_TYPE_NUMERIC:
    if (DateUtil.isCellDateFormatted(cell)) {
    value = sdf.format(cell.getDateCellValue());
  } else {
    value = "" + cell.getNumericCellValue();
 }
   break;
   default:
   value = "";
   break;
  }
   return value;
}

/**
*
* 描述:设置标题样式
*
* @param style
* @param font
* @return
*/
HSSFCellStyle setTitleStyle(HSSFCellStyle style, HSSFFont font) {
// 设置样式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
return style;
}

/**
*
* 描述:设置内容样式
*
* @param style
* @param font
* @return
*/
HSSFCellStyle setContentStyle(HSSFCellStyle style, HSSFFont font) {
// 设置样式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
font.setFontHeightInPoints((short) 12);
style.setFont(font);
return style;
}

如有不足请大家指出缺点。

posted @ 2016-09-09 11:03  戏子人生  阅读(136)  评论(0编辑  收藏  举报