第三部分:数据导入到excel
数据是由sql语句从数据库查出来的,最初想到的是直接写方法执行sql语句查出数据,然后写入excel,但是由于需要做成通用的公共方法,因此查数据的方法是动态的,无法确定,所以就用到了java的反射机制,首先写好服务层的方法,然后在前台将服务层注入的bean名称,与方法名传给后台,后台利用反射调用取数据,然后写入excel。
导入excel表需要用到poi的jar包:jar包如下:
poi-3.9-20121203.jar
xmlbeans-2.3.0.jar
poi-ooxml-3.9-20121203.jar
poi-examples-3.9-20121203.jar
poi-excelant-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
poi-scratchpad-3.9-20121203.jar
@Controller
public class FileTransferController extends BaseController{
//临时文件存放目录
public String tempPath = FileUtil.getProjectPath()+"\\temp\\";
/**
* 数据导出到excle表中
* @author zheng_liming
* @param request
* @param response
* @return
*/
@SuppressWarnings("rawtypes")
@RequestMapping(value = "/fileTransfer/exportToExcle", method = RequestMethod.POST)
public void exportToExcle(HttpServletRequest request,HttpServletResponse response) throws Exception{
DynamicForm dynamicForm =(DynamicForm) PlatformContext.getRequestAttribute(SystemConstants.DYNAMICFORM);
//反射调用方法
List<Map<String, Object>> resultList = reflect(dynamicForm);
String fileType = "xlsx";
//创建工作文档对象
Workbook wb = null;
HSSFFont xlsFont = null;
HSSFCellStyle xlsStyle = null;
XSSFFont xlsxFont = null;
XSSFCellStyle xlsxStyle = null;
if (fileType.equals("xls")) {
wb = new HSSFWorkbook();
xlsFont = (HSSFFont) wb.createFont();//字体
xlsFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
xlsStyle = (HSSFCellStyle) wb.createCellStyle();//样式
xlsStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
xlsStyle.setFont(xlsFont);//单元格字体
}else if(fileType.equals("xlsx")){
wb = new XSSFWorkbook();
xlsxFont = (XSSFFont) wb.createFont();//字体
xlsxFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//字体加粗
xlsxStyle = (XSSFCellStyle) wb.createCellStyle();//样式
xlsxStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//水平居中
xlsxStyle.setFont(xlsxFont);//单元格字体
}else{
System.out.println("您的文档格式不正确!");
return;
}
//创建sheet对象
Sheet sheet1 = (Sheet) wb.createSheet("sheet1");
int headNum = 0;//表头从0开始
int rowNum = 1;//行数据从1开始
int totalCellNum = 0;
//创建表头的行
Row head = (Row) sheet1.createRow(headNum);
//循环写入行数据
for (Map<String, Object> map : resultList) {
int cellNum = 0;
Row row = (Row) sheet1.createRow(rowNum);
Iterator it = map.keySet().iterator();
//循环写入列数据
while (it.hasNext()) {
String key = (String) it.next();
//第一次外循环的时候将表头数据写入
if(rowNum==1){
Cell headCell = head.createCell(cellNum);
headCell.setCellValue(key.equals("rn")?"序号":key);
//表头样式
headCell.setCellStyle(xlsStyle==null?xlsxStyle:xlsStyle);
}
//将行数据写入
Cell cell = row.createCell(cellNum);
cell.setCellValue(map.get(key).toString());
cellNum = cellNum+1;
}
totalCellNum = cellNum;
rowNum = rowNum+1;
}
//自动调整列宽
for (int i=0;i<totalCellNum;i++) {
sheet1.autoSizeColumn(i);
}
String timeStr = DateUtil.dateToDateString(new Date(),"yyyyMMddHHmmss");
File file = new File(tempPath);
if (!file.exists()) {
file.mkdirs();
}
//创建文件流
OutputStream stream = new FileOutputStream(tempPath+timeStr+"."+fileType);
//写入文件并保存到工程目录下
wb.write(stream);
//关闭文件流
stream.close();
//将工程目录下的文件下载到客户端
downFile(tempPath,timeStr+"."+fileType);
//删除工程目录下文件
FileUtil.removeAllFile(tempPath);
FileUtil.removeFolder(tempPath);
}
/**
* 将服务器上的文件下载到客户端
* @author zheng_liming
* @param filePath 文件路径
* @param fileName 文件名称
*/
public void downFile(String filePath,String fileName) throws Exception{
FileInputStream fis = new FileInputStream(new File(filePath+fileName));
//设置响应头和保存文件名
HttpServletResponse response = getResponse();
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
//写出流信息
int b = 0;
PrintWriter out = response.getWriter();
while((b=fis.read())!=-1) {
out.write(b);
}
//关闭
fis.close();
out.close();
}
/**
* 反射调用类方法
* @author zheng_liming
* @param className 类名
* @param methodName 方法名
* @return List<Map<String, Object>> 调用的方法返回值
*/
@SuppressWarnings("unchecked")
public List<Map<String, Object>> reflect(DynamicForm dynamicForm) throws Exception{
String className = dynamicForm.getString("className");
String methodName = dynamicForm.getString("methodName");
//初始化
MethodInvoker methodInvoker = new MethodInvoker();
methodInvoker.setTargetObject(SpringContext.getBean(className));
methodInvoker.setTargetMethod(methodName);
//设置参数
methodInvoker.setArguments(new Object[]{dynamicForm});
//准备方法
methodInvoker.prepare();
Object result = methodInvoker.invoke();
Map<String, Object> resultMap = (Map<String, Object>) result;
List<Map<String, Object>> resultList = (List<Map<String, Object>>) resultMap.get("rows");
return resultList;
}
}