【前言】
我们项目经理要看一下贝瓦给我们提供了哪些数据,所以就导出一下咯
【正文】
废不多话,直接上代码
/**
* 从贝瓦获取指定频道下的作品并导出到excel文件中
*
* @param albumExportPreUrl 获取数据url的前部分
* @param page 当前页
*/
public void exportAlbumOrContent(String fileNames, String albumExportPreUrl,
String page) throws Exception {
//文件相关,UUID 防重名,以为对方一次只能给20条数据(真分页)
UUID uuid = UUID.randomUUID();
String fileName = fileNames + uuid.toString() + "专辑.xls";
File file = new File(fileName);
String contentOfCatUrl = albumExportPreUrl + page + "&access-token=" + bevaResource.getBevaToken();
;
JSONObject formResource = getJSONObjectBeva(contentOfCatUrl);
//获取表格的列名,没有tags,因为是空的
Map<String, String> bevaDataExcelTitle = BevaDataMapOfExcelTitle();//设置标题
JSONArray jsonArray = formResource.getJSONObject("data").getJSONArray("items");
//生成excel文件
saveFile(bevaDataExcelTitle, jsonArray, file);
}
/**
* 为url添加token,并且调用贝瓦的数据
*
* @param strUrl 基础url
* @return 贝瓦的数据
*/
private JSONObject getJSONObjectBeva(String strUrl) throws Exception {
strUrl = strUrl + "&access-token=" + bevaResource.getBevaToken();
strUrl = strUrl.replaceAll("[;\"]", "");//拼接的url 去除分隔符符合url要求
return restTemplate.getForEntity(strUrl, JSONObject.class).getBody();
}
设置标题:
/**
* 导出excel的列名
*
* @return
*/
private Map<String, String> BevaDataMapOfExcelTitle() {
Map<String, String> excelTitle = new LinkedHashMap<>();
excelTitle.put("id", "作品id");
excelTitle.put("name", "作品名称");
excelTitle.put("cont_type", "作品类型");
excelTitle.put("ad_play_type", "支持广告播放的情况");
excelTitle.put("description", "作品描述");
excelTitle.put("play_count", "作品的总播放次数");
excelTitle.put("vip_label", "是否需要vip和收费");
excelTitle.put("img_small", "小的图片");
excelTitle.put("img_middle", "中等的图片");
excelTitle.put("img_big", "大的图片");
excelTitle.put("published_at", "专辑发布时间");
excelTitle.put("created_at", "专辑创建时间");
excelTitle.put("updated_at", "专辑最后修改时间");
return excelTitle;
}
导出:
saveFile(bevaDataExcelTitle, jsonArray, file);
/**
* 导出文件
*
* @param headData
* @param listData
* @param file
* @return
*/
private File saveFile(Map<String, String> headData, JSONArray listData, File file) {
// 创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
// sheet:一张表的简称
// row:表里的行
// 创建工作薄中的工作表
HSSFSheet hssfSheet = hssfWorkbook.createSheet();
// 创建行
HSSFRow row = hssfSheet.createRow(0);
// 创建单元格,设置表头 创建列
HSSFCell cell = null;
// 初始化索引
int rowIndex = 0;
int cellIndex = 0;
// 创建标题行
row = hssfSheet.createRow(rowIndex);
rowIndex++;
// 遍历标题
for (String h : headData.keySet()) {
// 创建列
cell = row.createCell(cellIndex);
// 索引递增
cellIndex++;
// 逐列插入标题
cell.setCellValue(headData.get(h));
}
// 得到所有记录 行:列
JSONObject record = null;
if (listData != null) {
// 获取所有的记录 有多少条记录就创建多少行
for (int i = 0; i < listData.size(); i++) {
row = hssfSheet.createRow(rowIndex);
// 得到所有的行 一个record就代表 一行
record = listData.getJSONObject(i);
// 下一行索引
rowIndex++;
// 刷新新行索引
cellIndex = 0;
// 在有所有的记录基础之上,便利传入进来的表头,再创建N行
for (String h : headData.keySet()) {
cell = row.createCell(cellIndex);
cellIndex++;
// 按照每条记录匹配数据
cell.setCellValue(record.get(h) == null ? "" : record.get(h).toString());
}
}
}
try {
FileOutputStream fileOutputStreane = new FileOutputStream(file);
hssfWorkbook.write(fileOutputStreane);
fileOutputStreane.flush();
fileOutputStreane.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
会导出到文件file中的路径下,导出很多文件手动合并显然不太科学、网上看了一下excel本身提供了函数支持,java有代码,下面的代码我没有试验、看着挺不错、充一下门面:
/**
* TODO合并excel为一个文件
* @param outputFileName
* @param inputFileNameArray
*/
//@RequestMapping(value = "/mergExcel", method = RequestMethod.GET)
public void mergeExcel(@RequestParam(value = "outputFileName") String outputFileName,
@RequestBody String... inputFileNameArray) {
if (inputFileNameArray.length == 1) {
return;
}
try {
WritableWorkbook outputExcel = Workbook.createWorkbook(new File(outputFileName));
int index = 0;
for (String fileName : inputFileNameArray) {
// 创建excel文件的工作簿对象book
Workbook inputExcel = Workbook.getWorkbook(new FileInputStream(fileName));
// 获取excel文件工作簿的工作表数量sheets
Sheet[] sheets = inputExcel.getSheets();
for (Sheet sheet : sheets) {
WritableSheet writableSheet = outputExcel.createSheet(sheet.getName(), index);
copy(sheet, writableSheet);
index++;
}
}
/** **********将以上缓存中的内容写到EXCEL文件中******** */
outputExcel.write();
outputExcel.close();
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
}
}
private static void copy(Sheet formSheet, WritableSheet toWritableSheet) {
// 行数
int rows = formSheet.getRows();
// 列数
int columns = formSheet.getColumns();
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
for (int columnIndex = 0; columnIndex < columns; columnIndex++) {
// 获取当前工作表.row_index,column_index单元格的cell对象
Cell cell = formSheet.getCell(columnIndex, rowIndex);
try {
CellFormat wcf = new WritableCellFormat();
if (cell.getCellFormat() != null) {
wcf = cell.getCellFormat();
}
toWritableSheet.addCell(new Label(columnIndex, rowIndex, cell.getContents(), wcf));
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
}
}
}
}
【后语】
有一个动态获取token的过程,暂时不写了,下篇说或者看心情再说吧