需求
前端页面添加一个导出xml按钮,实现选中数据按给定xml模板导出数据
模板样图
导出结果样图
前端代码
<a-button type="primary" icon="download" @click="handleExportXml('title')">导出Xml</a-button>
<script>
export default {
url: {
exportXmlUrl: "/./exportXml" //后端路由
},
methods:{
/* 导出 xml*/
handleExportXml(fileName){
console.log("导出xml")
console.log("选中数据",this.selectedRowKeys)
if(!fileName || typeof fileName != "string"){
fileName = "导出文件"
}
let param = this.getQueryParams();
if(this.selectedRowKeys && this.selectedRowKeys.length>0){
param['selections'] = this.selectedRowKeys.join(",")
}
downFile(this.url.exportXmlUrl,param).then((data)=>{
if (!data) {
this.$message.warning("文件下载失败")
return
}
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(new Blob([data],{type: 'text/xml'}), fileName+'.xml')
}else{
let url = window.URL.createObjectURL(new Blob([data],{type: 'text/xml'}))
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', fileName+'.xml')
document.body.appendChild(link)
link.click()
document.body.removeChild(link); //下载完成移除元素
window.URL.revokeObjectURL(url); //释放掉blob对象
}
})
}
}
}
</select>
后端代码
/**
* 导出xml数据
* @param request
* @param ctFinancialProductInfor
* @return
*/
@RequestMapping(value = "/exportXml")
public String exportXml(HttpServletRequest request, CtFinancialProductInfor ctFinancialProductInfor) {
return this.createXml( request, ctFinancialProductInfor);
}
public String createXml(HttpServletRequest request, CtFinancialProductInfor ctFinancialProductInfor){
try {
//获取查询数据
List datalist = super.listdata( request,ctFinancialProductInfor );
// 先把List<T>对象转成json字符串
String into = JSONObject.toJSONString(datalist);
// 把json字符串转换成List<Map<Object, Object>>
List<Map<Object, Object>> mapList = (List<Map<Object, Object>>) JSONArray.parse(into);
final String head = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n";
final String root_start = "<RelatedParties>";
final String root_end = "</RelatedParties>";
StringBuffer sb = new StringBuffer();
sb.append(head);
sb.append(root_start);
//xml模板目录
MessageFormat mf = new MessageFormat(readFileByer("jeecg-boot-module-system/src/main/resources/xml_template/B01金融产品_YYYYMMDD.xml"));
Map<Object, Object> map;
for (int i=0; i<mapList.size(); i++) {
// 获取Map<Object, Object>对象
map = mapList.get(i);
//删除不必要的字段
String[] move_key = {"id","createTime","updateTime","createBy","cardType","createPerson","updateBy","sysOrgCode"};
for(int j =0;j<move_key.length;j++){
map.remove(move_key[j]);
}
String[] strings =map.values().toArray(new String[0]);
sb.append(mf.format( strings));
}
sb.append(root_end);
System.out.println("生成xml成功");
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成xml失败");
return null;
}
}
//使用模板生成xml文件
public static String readFileByer(String filePath) {
StringBuffer sb = new StringBuffer();
File file = new File(filePath);
FileReader fr = null;
try {
fr = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader br = new BufferedReader(fr);
String strLine = "";
try {
while ((strLine = br.readLine()) != null) {
sb.append(strLine);
sb.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fr.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
protected List listdata(HttpServletRequest request, T object) {
// Step.1 组装查询条件
QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());
// Step.2 获取导出数据
List<T> pageList = service.list(queryWrapper);
List<T> exportList = null;
// 过滤选中数据
String selections = request.getParameter("selections");
if (oConvertUtils.isNotEmpty(selections)) {
List<String> selectionList = Arrays.asList(selections.split(","));
exportList = pageList.stream().filter(item -> selectionList.contains(getId(item))).collect(Collectors.toList());
} else {
exportList = pageList;
}
return exportList;
}