关闭

JAVA实现EXL的导入导出功能

标签: java
1691人阅读 评论(1) 收藏 举报
分类:
有过经验的程序猿都写过exl表格的导入导出功能!而大部分人都没抽时间去研究功能实现的细节,只是一味的为实现功能而写代码!今天也抽点时间对实现exl表格的
导入导出做个小结,针对JAVA开发!
一、EXL导入功能:
(1)、实现步骤:
a、通过流获取指定文件中的exl工作薄
b、遍历工作薄中的工作表
c、遍历工作表中的行
d、遍历工作表中的行中的列
e、判断指定单元表格中值得类型并获取值,进而进行其他操作
(2)、功能代码实现:
package com.tf.util;
/**

* EXL表格导入

* @author wangbf

* @date 2015-11-13

 */

public class ImportExcel {
/**

* 导入exl表格中内容

 * @param file 

 */
@SuppressWarnings({"static-access" })
public static void importData(File file) {
// 得到工作簿
HSSFWorkbook hssfworkBook = getHSSFWorkbook(file);
// 工作簿中的工作表
HSSFSheet hssfsheet = null;
// 工作表中的行
HSSFRow hssfrow = null;
// 遍历工作簿中的工作表(i表示工作表的数量 ,getNumberOfSheets表示工作表的总数)
for (int i = 0; i < hssfworkBook.getNumberOfSheets(); i++) {
// 获取第i个工作表格
hssfsheet = hssfworkBook.getSheetAt(i);
for (int j = 1; j <= hssfsheet.getLastRowNum(); j++) {
// 获取指定表格中的第j行
hssfrow = hssfsheet.getRow(j);
for (int s = 0; s < hssfrow.getLastCellNum(); s++) {
// 获取指定行中的第s列表格
Cell cell = hssfrow.getCell(s);
// 字符串
if (cell.getCellType() == cell.CELL_TYPE_STRING) {
System.out.println(cell.getStringCellValue());
}
// 数值
else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
System.out.println((long)cell.getNumericCellValue());
}
// 空值
else if (cell.getCellType() == cell.CELL_TYPE_BLANK) {
System.out.println("空值");
}
// boolean值
else if (cell.getCellType() == cell.CELL_TYPE_BOOLEAN) {
System.out.println(cell.getBooleanCellValue());
}
// 公式
else if (cell.getCellType() == cell.CELL_TYPE_FORMULA) {
System.out.println(cell.getCellFormula());
}
// 故障
else if (cell.getCellType() == cell.CELL_TYPE_ERROR) {
System.out.println("存在故障**********");
}
// 未知类型
else {
System.out.println("未知类型的值");
}
}
}
}
};

/**
* 根据文本获取exl工作簿

 * @param file

* @return hssfworkBook 工作簿
*/
private static HSSFWorkbook getHSSFWorkbook(File file) {
// poi文件流
POIFSFileSystem fs = null;
// 工作簿
HSSFWorkbook hssfworkBook = null;
try {
// 得到文件输入流
fs = new POIFSFileSystem(new FileInputStream(file));
hssfworkBook = new HSSFWorkbook(fs);
return hssfworkBook;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;

}
}
(3)、温馨提示:需要用到第三方jar包,请www.baidu.com
二、EXL导出功能:
(1)、实现步骤:
a、创建工作薄
b、生成相关表样式
c、遍历要导出的数据
d、利用输出流导出数据到指定exl中
(2)、功能代码实现:
package com.tf.util;

public class ExportExcel {

/**
* 生成统计报表excel的方法

* @param title 每个sheet文件名
* @param headers 表头字段
* @param lists 数据集合
* @param out 输出流
*/
public static void exportRecordsExcel(String title, List<String> headers, List<Map<String, Object>> lists, OutputStream out) {
// 声明一个工作薄(操作2003版的)
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个样式(给标题头设置样式)
HSSFCellStyle style = createHSSFCellStyle((short) 5, workbook);
// 生成另一个样式(给数据设置样式)
HSSFCellStyle style2 = createHSSFCellStyle(HSSFCellStyle.VERTICAL_CENTER, workbook);
// 遍历集合数据,产生数据行
Iterator<Map<String, Object>> it = lists.iterator();
// 记录数
int index = 0;
// 电子表单引用
HSSFSheet sheet = null;
// 电子表单编号
int sheetNumber = 0;
sheet = getSheet(workbook, title, style, headers, sheetNumber++);
while (it.hasNext()) {
Map<String, Object> rr = it.next();
List<HSSFCell> cells = getHSSCells(5, style2, sheet, ++index);
// 为单元格设值
cells.get(0).setCellValue(rr.get("ID").toString());
cells.get(1).setCellValue(rr.get("name").toString());
cells.get(2).setCellValue(rr.get("age").toString());
cells.get(3).setCellValue(rr.get("phone").toString());
cells.get(4).setCellValue(rr.get("job").toString());
}
// 将工作簿写到服务器上
writeWorkBookToServer(workbook, out);
}

/**
* 创建一个样式

* @param hSSFCellStyle 样式
* @param workbook 工作薄
* @return 样式
*/
private static HSSFCellStyle createHSSFCellStyle(short hSSFCellStyle, HSSFWorkbook workbook) {
HSSFCellStyle style = workbook.createCellStyle();
// 设置单元格填充样式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 设置单元格背景颜色
style.setFillForegroundColor(HSSFColor.LIGHT_BLUE.index);
// 设置单元格底部边界
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);
// 创建一个字体样式
HSSFFont font = workbook.createFont();
if (hSSFCellStyle == HSSFCellStyle.VERTICAL_CENTER) {
style.setVerticalAlignment(hSSFCellStyle);
font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
font.setStrikeout(false);
} else {
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
}
// 把字体应用到当前的样式
style.setFont(font);
return style;
}

// 产生标题行
@SuppressWarnings("deprecation")
private static void createTitleRow(HSSFSheet sheet, CellStyle style, List<String> headers) {
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers.get(i));
cell.setCellValue(text);
}
}

// 得到一个sheet
@SuppressWarnings("deprecation")
private static HSSFSheet getSheet(HSSFWorkbook workbook, String title, HSSFCellStyle style, List<String> headers, int sheetNumber) {
// 生成一个表格 title 表示文件名
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(sheetNumber, title + sheetNumber);
// 产生表格标题行
createTitleRow(sheet, style, headers);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);
return sheet;
}

/**
* 生成指定单元格个数的行

* @param colomnNumber 单元格数
* @param style 设置样式
* @param sheet 工作表格
* @param index 行索引从1开始
* @return 单元格集合
*/
private static List<HSSFCell> getHSSCells(int colomnNumber, CellStyle style, HSSFSheet sheet, int index) {
HSSFRow row = sheet.createRow(index);
// 生成一行的单元格
List<HSSFCell> cells = new ArrayList<HSSFCell>();
for (int i = 0; i < colomnNumber; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
cells.add(cell);
}
return cells;
}

private static void writeWorkBookToServer(HSSFWorkbook workbook, OutputStream out) {
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35593次
    • 积分:622
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    最新评论