Java往事之《Excel导出数据》
Excel导出数据
下面是个demo,Java实现生成Excel文件 打包成zip,提供下载!
@Controller
@RequestMapping("/importOut/")
public class ImportOutController {
@RequestMapping(value="excel", method = RequestMethod.POST)
public String importOut(){
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdf_day = new SimpleDateFormat("yyyy-MM-dd");
String outPutPath=ServerUtil.UPLOAD_URL+sdf_day.format(new Date())+"\\";//创建临时目录
createOrder();//调用获取所有订单数据,以及生成Excel文档!
//打成zip包
List<File> files = new ArrayList<File>();
File Allfile = new File(outPutPath);
if (Allfile.exists()) {
File[] fileArr = Allfile.listFiles();
for (File file2 : fileArr) {
files.add(file2);
}
}
if(files.size()<1){
request.setAttribute("error","没有可导出的文件!");
return "importout";
}
String fileName = sdf2.format(new Date())+ ".zip";//UUID.randomUUID().toString() + ".zip";
// 在服务器端创建打包下载的临时文件
File fileZip = new File(outPutPath + fileName);
// 文件输出流
FileOutputStream outStream = new FileOutputStream(fileZip);
// 压缩流
ZipOutputStream toClient = new ZipOutputStream(outStream);
this.zipFile(files, toClient);
toClient.close();
outStream.close();
this.downloadFile(fileZip, response, false,Allfile);
//清除临时目录以及目录下的文件
File file = new File(outPutPath);
deleteDir(file);
return "importout";
}
/**
*查询全部订单
*/
private void createOrder(){
List<OrderInfo> projects =orderService.searchOrderCSV();//调用service层 查询获得所有订单数据
String sheetName ="玩家订单查询";//定义excel名字
List<Map<String, String>> listmap = new ArrayList<Map<String, String>>();
OrderInfo order=null;
for (int j = 0; j < projects.size(); j++) {//把订单数据集合 转换为 List<Map<String, String>>类型
order=projects.get(j);
Map<String, String> mapValue = new LinkedHashMap<String, String>();
mapValue.put("successTime", Loader.df.format(order.getSuccessTime()));
mapValue.put("oid", String.valueOf(order.getOid()));
mapValue.put("type",String.valueOf(order.getType()));
mapValue.put("num",String.valueOf(order.getNum()));
mapValue.put("sendRid",String.valueOf(order.getSendRid()));
mapValue.put("rid", String.valueOf(order.getRid()));
listmap.add(mapValue);
}
String columnNames[]={"时间","订单号","类型","金条数量","发放人ID","玩家ID"};//列名
String keys[] = {"successTime","oid","type","num","sendRid","rid"};//map中的key
CSVUtils.createCSVFile(listmap,columnNames,keys,sheetName);//调用CSVUtils类中createCSVFile()方法生成excel文件
}
/**
* 下载文件
* @param file
* @param response
* @param isDelete
*/
public void downloadFile(File file,HttpServletResponse response,boolean isDelete,File Allfile) {
try {
// 以流的形式下载文件。
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"));
toClient.write(buffer);
toClient.flush();
toClient.close();
if(isDelete)
{
file.delete(); //是否将生成的服务器端文件删除
//System.out.println(Allfile.isFile());
if(Allfile.isDirectory()) {
File[] childFilePaths = Allfile.listFiles();
for(File childFile : childFilePaths){
//System.out.println("删除:"+childFile.getName());
childFile.delete();
}
}
Allfile.delete();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
public void zipFile(List<File> files, ZipOutputStream outputStream) throws IOException, ServletException {
try {
int size = files.size();
// 压缩列表中的文件
for (int i = 0; i < size; i++) {
File file = (File) files.get(i);
zipFile(file, outputStream);
}
} catch (IOException e) {
throw e;
}
}
private static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
//递归删除目录中的子目录下
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// 目录此时为空,可以删除
return dir.delete();
}
}
public class CSVUtils {
public static File createCSVFile(List exportData,String columnNames[], String []keys,
String filename) {
SimpleDateFormat sdf_day = new SimpleDateFormat("yyyy-MM-dd");
String outPutPath=ServerUtil.UPLOAD_URL+sdf_day.format(new Date())+"\\";
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
csvFile = new File(outPutPath + filename + ".csv");
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile();
// GB2312使正确读取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(csvFile), "GB2312"), 1024);
// 写入文件头部
for(int i=0;i<columnNames.length;i++){
csvFileOutputStream.write("\""
+ columnNames[i].toString() + "\"");
csvFileOutputStream.write(",");
}
csvFileOutputStream.newLine();
// 写入文件内容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for(int i=0;i<keys.length;i++){
csvFileOutputStream.write("\""
+ BeanUtils.getProperty(row,keys[i]).toString() + "\"");
csvFileOutputStream.write(",");
}
if (iterator.hasNext()) {
csvFileOutputStream.newLine();
}
}
csvFileOutputStream.flush();
} catch (Exception e) {
logger.error("Exception", e);
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
logger.error("IOException", e);
}
}
return csvFile;
}
}