人员简历导出下载(20230105)

pull/123/head^2
Mlin 2 years ago
parent 06da61d889
commit 5450b99e37

@ -2,6 +2,7 @@ package com.engine.organization.service;
import com.engine.organization.entity.searchtree.SearchTreeParams; import com.engine.organization.entity.searchtree.SearchTreeParams;
import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
/** /**
@ -36,9 +37,10 @@ public interface PersonnelResumeService {
/** /**
* *
* @param params * @param type
* @param response
* @return * @return
*/ */
Map<String, Object> downloadPerResume(SearchTreeParams params); String downloadPerResume(Integer type, HttpServletResponse response) throws Exception;
} }

@ -24,17 +24,28 @@ import com.engine.organization.mapper.resource.HrmResourceMapper;
import com.engine.organization.service.PersonnelResumeService; import com.engine.organization.service.PersonnelResumeService;
import com.engine.organization.util.MenuBtn; import com.engine.organization.util.MenuBtn;
import com.engine.organization.util.OrganizationAssert; import com.engine.organization.util.OrganizationAssert;
import com.engine.organization.util.WordUtil;
import com.engine.organization.util.db.MapperProxyFactory; import com.engine.organization.util.db.MapperProxyFactory;
import com.engine.organization.util.detach.DetachUtil; import com.engine.organization.util.detach.DetachUtil;
import com.engine.organization.util.page.PageUtil; import com.engine.organization.util.page.PageUtil;
import com.engine.organization.util.tree.SearchTreeUtil; import com.engine.organization.util.tree.SearchTreeUtil;
import com.engine.organization.util.word.CustomXWPFDocument;
import com.engine.organization.util.word.WordUtil;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlOptions;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
import weaver.general.GCONST;
import weaver.general.StringUtil; import weaver.general.StringUtil;
import weaver.general.Util; import weaver.general.Util;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/** /**
* @author:dxfeng * @author:dxfeng
@ -167,67 +178,237 @@ public class PersonnelResumeServiceImpl extends Service implements PersonnelResu
} }
@Override @Override
public Map<String, Object> downloadPerResume(SearchTreeParams params) { public String downloadPerResume(Integer type, HttpServletResponse response) throws Exception {
// 调用word文档帮助类
WordUtil wordUtil = new WordUtil(); //首先定义一个XWPFDocument 集合 这个对象可以进行word 解析 合并 还有下载都离不开这个对象
List<CustomXWPFDocument> xwpfDocuments = new ArrayList<>();
// 模板文件存放的目录 //模板地址
wordUtil.setBaseDir("E:/ww"); String outPutPath = GCONST.getRootPath() + "hrm" + File.separator + "import" + File.separator + "template" + File.separator;
String filePath = outPutPath + "template0104.docx";
// 模板文件名称 //创建压缩包位置
wordUtil.setTemplateFile("template.ftl"); File fileZip = new File(outPutPath + "wordZip");
if (!fileZip.exists()) {
// word生成的输出目录 fileZip.mkdirs();
wordUtil.setOutputDir("E:/image/"); }
// 处理赋值的数据
// 初始化数据map Map<String, Object> dataMap = new HashMap<>();
Map<String,Object> dataMap = new HashMap<>(); Map<String, Object> resMap = getResumeList(22);
dataMap = getResumeList(23); Map<String, Object> resMap2 = getResumeList(29);
// Object tables = dataMap.get("tables"); List<Map<String, Object>> dataMapList = new ArrayList<>();
// System.out.println(tables); dataMapList.add(resMap);
if (dataMap.containsKey("tables")){ dataMapList.add(resMap2);
List<PersonnelResumeTable> tables = (List<PersonnelResumeTable>) dataMap.get("tables"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
String filesPath = outPutPath + "wordZip" + File.separator + simpleDateFormat.format(new Date());
for (int t=0;t<tables.size();t++){ String fileAllWordPath = outPutPath + "wordZip";
PersonnelResumeTable personnelResumeTable = tables.get(t); String wordName = "全体人员简历合并导出";
int length = personnelResumeTable.getColumns().size(); //处理所有数据
if(personnelResumeTable.getDatas().size()>0){ for (int count = 0; count < dataMapList.size(); count++) {
List<List<PersonnelResumeColumn>> datas = personnelResumeTable.getDatas(); //处理单人数据
if (datas.size()>0){ Map<String, Object> paramMap = new HashMap<>();
List<PersonnelResumeColumn> dataList = datas.get(0); for (Map.Entry<String, Object> entry : dataMapList.get(count).entrySet()) {
for (int i=0;i<length;i++){ System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
dataMap.put("col"+t + i,dataList.get(i).getValue()); paramMap.put("${" + entry.getKey() + "}", entry.getValue());
}
if (dataMapList.get(count).containsKey("tables")) {
List<PersonnelResumeTable> tables = (List<PersonnelResumeTable>) dataMapList.get(count).get("tables");
for (int t = 0; t < tables.size(); t++) {
PersonnelResumeTable personnelResumeTable = tables.get(t);
int length = personnelResumeTable.getColumns().size();
if (personnelResumeTable.getDatas().size() > 0) {
List<List<PersonnelResumeColumn>> datas = personnelResumeTable.getDatas();
if (datas.size() > 0) {
List<PersonnelResumeColumn> dataList = datas.get(0);
for (int i = 0; i < length; i++) {
paramMap.put("${col" + t + i + "}", Util.null2String(dataList.get(i).getValue()));
}
} }
} }
} }
} }
paramMap.put("${@image}", "1198");
WordUtil wordUtil = new WordUtil();
//返回一个新的xwpfDocument对象
File file = new File(filePath);
CustomXWPFDocument doc = null;
InputStream is = new FileInputStream(file);
doc = new CustomXWPFDocument(is);
wordUtil.replaceInPara(doc, paramMap);
wordUtil.replaceInTable(doc, paramMap);
xwpfDocuments.add(doc);
is.close();
File files = new File(filesPath);
if (!files.exists()) {
files.mkdirs();
} else {
delFolder(files.getPath());
files.mkdirs();
}
String fileName = paramMap.get("${lastName}") + ".docx";
System.out.println(fileName);
FileOutputStream os = null;
os = new FileOutputStream(filesPath + File.separator + new File(fileName));
doc.write(os);
} }
// 录入表格数据(3条数据循环三次) if (xwpfDocuments.size() > 0) {
for (int i = 1; i <= 3; i++) { //这样第一步将所有word内容替换之后生成多个 xwpfDocument
dataMap.put("dataName"+i, "笔记本电脑"+i); //现在将多个xwpfDocument 进行合并 追加 生成word文件
dataMap.put("dataBand"+i, "金山牌"+i); CustomXWPFDocument xwpfDocument = xwpfDocuments.get(0);
dataMap.put("model"+i, "JHHJ6"+i); for (int i = 0; i < xwpfDocuments.size(); i++) {
dataMap.put("price"+i, 5000+i); //每次的追加为了避免样式和格式混乱 加上分页符
dataMap.put("quantity"+i, 3+i); //当是只有一条数据的时候 直接输出
dataMap.put("total"+i, 15000+i); if (i == 0) {
xwpfDocument = xwpfDocuments.get(0);
xwpfDocument.write(new FileOutputStream(fileAllWordPath + File.separator + new File(wordName + ".docx")));
continue;
} else {
//当存在多条时候
xwpfDocument = mergeWord(xwpfDocument, xwpfDocuments.get(i));
xwpfDocument.write(new FileOutputStream(fileAllWordPath + File.separator + new File(wordName + ".docx")));
}
}
}
String resPath = fileAllWordPath + File.separator + new File(wordName + ".docx");
if (type == 1) {
compressFileToZip(filesPath);
resPath = filesPath + ".zip";
} }
return resPath;
}
//处理定价方式复选框 //两个对象进行追加
dataMap.put("select", "☑境内采购" + "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t" + "□境外采购"); public CustomXWPFDocument mergeWord(CustomXWPFDocument document, CustomXWPFDocument doucDocument2) throws Exception {
CustomXWPFDocument src1Document = document;
XWPFParagraph p = src1Document.createParagraph();
//设置分页符
p.setPageBreak(true);
CTBody src1Body = src1Document.getDocument().getBody();
CustomXWPFDocument src2Document = doucDocument2;
CTBody src2Body = src2Document.getDocument().getBody();
XWPFParagraph p2 = src2Document.createParagraph();
XmlOptions optionsOuter = new XmlOptions();
optionsOuter.setSaveOuter();
String appendString = src2Body.xmlText(optionsOuter);
String srcString = src1Body.xmlText();
String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
String sufix = srcString.substring(srcString.lastIndexOf("<"));
String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
src1Body.set(makeBody);
return src1Document;
}
String oldPath = wordUtil.createWord(dataMap); public static boolean compressFileToZip(String compresspath) {
boolean bool = false;
try {
ZipOutputStream zipOutput = null;
File file = new File(compresspath);
if (file.isDirectory()) {
zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(compresspath + ".zip")));
compressZip(zipOutput, file, "");
} else {
zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(compresspath.substring(0, compresspath.lastIndexOf(".")) + ".zip")));
}
zipOutput.closeEntry();
zipOutput.close();
bool = true;
} catch (Exception e) {
e.printStackTrace();
}
return bool;
}
if (oldPath.equals("操作失败")){ private static void compressZip(ZipOutputStream zipOutput, File file, String suffixpath) {
System.out.println("操作失败"); File[] listFiles = file.listFiles();// 列出所有的文件
for (File fi : listFiles) {
if (fi.isDirectory()) {
if (suffixpath.equals("")) {
compressZip(zipOutput, fi, fi.getName());
} else {
compressZip(zipOutput, fi, suffixpath + File.separator + fi.getName());
}
} else {
zip(zipOutput, fi, suffixpath);
}
} }
}
//输出生成后的文件路径 public static void zip(ZipOutputStream zipOutput, File file, String suffixpath) {
System.out.println(oldPath); try {
return null; ZipEntry zEntry = null;
if (suffixpath.equals("")) {
zEntry = new ZipEntry(file.getName());
} else {
zEntry = new ZipEntry(suffixpath + File.separator + file.getName());
}
zipOutput.putNextEntry(zEntry);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int read = 0;
while ((read = bis.read(buffer)) != -1) {
zipOutput.write(buffer, 0, read);
}
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/***
*
*
* @param folderPath
*/
public static void delFolder(String folderPath) {
try {
delAllFile(folderPath); // 删除完里面所有内容
String filePath = folderPath;
filePath = filePath.toString();
java.io.File myFilePath = new java.io.File(filePath);
myFilePath.delete(); // 删除空文件夹
} catch (Exception e) {
e.printStackTrace();
}
} }
/***
*
*
* @param path
* @return
*/
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);// 再删除空文件夹
flag = true;
}
}
return flag;
}
public List<SearchTree> getFilterDatas(String id, String type, String keyword) { public List<SearchTree> getFilterDatas(String id, String type, String keyword) {
List<SearchTree> searchTree = new ArrayList<>(); List<SearchTree> searchTree = new ArrayList<>();
// 通过分部、公司 组装数据 // 通过分部、公司 组装数据

@ -1,84 +0,0 @@
package com.engine.organization.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Data;
import java.io.*;
import java.util.Map;
/**
* @author
* @date
* @apiNote
*/
@Data
public class WordUtil {
private Configuration configuration = null;
/*
*
*/
private String baseDir;
/*
*
*/
private String templateFile;
/*
* word
*/
private String outputDir;
public WordUtil(){
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
/*
* <p>word<br>
*/
public String createWord(Map<String,Object> dataMap){
configuration.setClassForTemplateLoading(this.getClass(), "");//模板文件所在路径
Template t = null;
try {
//得到模板文件
configuration.setDirectoryForTemplateLoading(new File(baseDir));
} catch (IOException e) {
e.printStackTrace();
}
try {
t = configuration.getTemplate(templateFile,"utf-8");
} catch (IOException e) {
e.printStackTrace();
}
// GwUtil.getFileNo(""); 调用生成随机数的方法
File outFile = new File(outputDir + "222.doc"); //导出文件
Writer out = null;
try {
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件
return outFile.getPath();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "文档生成失败";
}
}

@ -0,0 +1,144 @@
package com.engine.organization.util.word;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import java.io.IOException;
import java.io.InputStream;
public class CustomXWPFDocument extends XWPFDocument {
public CustomXWPFDocument(InputStream in) throws IOException {
super(in);
}
public CustomXWPFDocument() {
super();
}
public CustomXWPFDocument(OPCPackage pkg) throws IOException {
super(pkg);
}
/**
* @param id
* @param width
* @param height
* @param paragraph
*/
public void createPicture(String blipId,int id, int width, int height, XWPFParagraph paragraph, CustomXWPFDocument doc) {
final int EMU = 9525;
width *= EMU;
height *= EMU;
CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
String picXml = ""
+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
+ " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""
+ id
+ "\" name=\"Generated\"/>"
+ " <pic:cNvPicPr/>"
+ " </pic:nvPicPr>"
+ " <pic:blipFill>"
+ " <a:blip r:embed=\""
+ blipId
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+ " <a:stretch>"
+ " <a:fillRect/>"
+ " </a:stretch>"
+ " </pic:blipFill>"
+ " <pic:spPr>"
+ " <a:xfrm>"
+ " <a:off x=\"0\" y=\"0\"/>"
+ " <a:ext cx=\""
+ width
+ "\" cy=\""
+ height
+ "\"/>"
+ " </a:xfrm>"
+ " <a:prstGeom prst=\"rect\">"
+ " <a:avLst/>"
+ " </a:prstGeom>"
+ " </pic:spPr>"
+ " </pic:pic>"
+ " </a:graphicData>" + "</a:graphic>";
inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try {
xmlToken = XmlToken.Factory.parse(picXml);
} catch (XmlException xe) {
xe.printStackTrace();
}
inline.set(xmlToken);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(id);
docPr.setName("图片" + blipId);
docPr.setDescr("头像");
}
public void createPicture(String blipId, int id, int width, int height, XWPFParagraph paragraph) {
final int EMU = 9525;
width *= EMU;
height *= EMU;
//String blipId = getAllPictures().get(id).getPackageRelationship().getId();
CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
String picXml = "" +
"<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +
" <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
" <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
" <pic:nvPicPr>" +
" <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" +
" <pic:cNvPicPr/>" +
" </pic:nvPicPr>" +
" <pic:blipFill>" +
" <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
" <a:stretch>" +
" <a:fillRect/>" +
" </a:stretch>" +
" </pic:blipFill>" +
" <pic:spPr>" +
" <a:xfrm>" +
" <a:off x=\"0\" y=\"0\"/>" +
" <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" +
" </a:xfrm>" +
" <a:prstGeom prst=\"rect\">" +
" <a:avLst/>" +
" </a:prstGeom>" +
" </pic:spPr>" +
" </pic:pic>" +
" </a:graphicData>" +
"</a:graphic>";
inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try {
xmlToken = XmlToken.Factory.parse(picXml);
} catch (XmlException xe) {
xe.printStackTrace();
}
inline.set(xmlToken);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(id);
docPr.setName("图片" + id);
docPr.setDescr("头像");
}
}

@ -0,0 +1,276 @@
package com.engine.organization.util.word;
import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.springframework.beans.BeanUtils;
import weaver.file.ImageFileManager;
import weaver.general.Util;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class WordUtil {
/**
*
*
* @param doc
* @param params
* @throws FileNotFoundException
* @throws InvalidFormatException
*/
public void replaceInPara(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {
Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
this.replaceInPara(para, params,doc);
}
}
/**
*
*
* @param para
* @param params
* @throws FileNotFoundException
* @throws InvalidFormatException
*/
public void replaceInPara(XWPFParagraph para, Map<String, Object> params, CustomXWPFDocument doc) throws InvalidFormatException, FileNotFoundException {
List<XWPFRun> runs;
Matcher matcher;
if (this.matcher(para.getParagraphText()).find()) {
runs = para.getRuns();
int start = -1;
int end = -1;
String str = "";
String text= "";
for (int i = 0; i < runs.size(); i++) {
text += runs.get(i).toString();
}
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
System.out.println("------>>>>>>>>>" + text);
if (text.contains("$")) {
start = text.indexOf("$");
}
if ((start != -1)) {
str += text.substring(text.indexOf("$"), text.length()).trim();
String paraList=runs.toString();
System.out.println("未删除前"+paraList);
Object[] runArr = runs.toArray();
int size=runs.size();
int $Index=0;
for (int j = 0; j < runArr.length; j++) {
if (runArr[j].toString().contains("$")) {
$Index=j;
break;
}
}
int startIn=$Index;
while (startIn<runs.size()) {
para.removeRun(startIn);
System.out.println("删除中"+para.getRuns());
}
System.out.println("删除后"+para.getRuns());
}
if ('}' == text.charAt(text.length() - 1)) {
if (start != -1) {
end = text.length() - 1;
break;
}
}
}
System.out.println("start--->"+start);
System.out.println("end--->"+end);
System.out.println("str---->>>" + str);
for (String key : params.keySet()) {
if (str.equals(key)) {
if(str.indexOf("@")==-1){
String value= params.get(key).toString();
para.createRun().setText(value);
break;
}else{
String value= params.get(key).toString();
int length = para.getRuns().size();
if (length > 0) {
for (int i = (length - 1); i >= 0; i--) {
para.removeRun(i);
}
}
//网络图片取文件数据
ImageFileManager manager = new ImageFileManager();
manager.getImageFileInfoById(Util.getIntValue(value));
InputStream inputStream = manager.getInputStream();
byte[] buff = new byte[8000];
int bytesRead = 0;
ByteArrayOutputStream bao = new ByteArrayOutputStream();
while(true) {
try {
if (!((bytesRead = inputStream.read(buff)) != -1)) break;
} catch (IOException e) {
e.printStackTrace();
}
bao.write(buff, 0, bytesRead);
}
byte[] data = bao.toByteArray();
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(data);
String blipId = doc.addPictureData(byteInputStream, CustomXWPFDocument.PICTURE_TYPE_PNG);
doc.createPicture(blipId,doc.getNextPicNameNumber(CustomXWPFDocument.PICTURE_TYPE_PNG), 120, 180,para);
break;
}
}
}
}
}
/**
*
*
* @param doc
* @param params
* @throws FileNotFoundException
* @throws InvalidFormatException
*/
public void replaceInTable(CustomXWPFDocument doc, Map<String, Object> params) throws InvalidFormatException, FileNotFoundException {
Iterator<XWPFTable> iterator = doc.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
List<XWPFParagraph> paras;
while (iterator.hasNext()) {
table = iterator.next();
rows = table.getRows();
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
this.replaceInPara(para, params,doc);
}
}
}
}
}
/**
*
*
* @param str
* @return
*/
private Matcher matcher(String str) {
Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
}
/**
*
*
* @param is
*/
public void close(InputStream is) {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
*
* @param os
*/
public void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* :线
*
* @param strUrl
* @return
* @see [/]()
* @since [/]()
*/
public static byte[] getImageData(String strUrl) {
InputStream inStream = null;
try {
// new一个URL对象
URL url = new URL(strUrl);
// 打开链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方式为"GET"
conn.setRequestMethod("GET");
// 超时响应时间为5秒
conn.setConnectTimeout(10 * 1000);
// 通过输入流获取图片数据
inStream = conn.getInputStream();
byte[] data = readInputStream(inStream);
return data;
} catch (Exception e) {
return null;
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (Exception e2) {
System.out.println("关闭流失败");
}
}
}
}
/**
* :
*
* @param inStream
* @return
* @throws Exception
* @see [/]()
* @since [/]()
*/
public static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 创建一个Buffer字符串
byte[] buffer = new byte[1024];
// 每次读取的字符串长度,如果为-1代表全部读取完毕
int len = 0;
// 使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
// 用输出流往buffer里写入数据中间参数代表从哪个位置开始读len代表读取的长度
outStream.write(buffer, 0, len);
}
// 关闭输入流
inStream.close();
// 把outStream里的数据写入内存
return outStream.toByteArray();
}
}

@ -11,6 +11,7 @@ import weaver.general.Util;
import weaver.hrm.HrmUserVarify; import weaver.hrm.HrmUserVarify;
import weaver.hrm.User; import weaver.hrm.User;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET; import javax.ws.rs.GET;
@ -18,6 +19,11 @@ import javax.ws.rs.Path;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.*;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.util.Map; import java.util.Map;
/** /**
@ -84,11 +90,23 @@ public class PersonnelResumeController {
*/ */
@GET @GET
@Path("/downloadPerResume") @Path("/downloadPerResume")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_OCTET_STREAM)
public Map<String, Object> downloadPerResume(@Context HttpServletRequest request, @Context HttpServletResponse response){ public Response downloadPerResume(@Context HttpServletRequest request, @Context HttpServletResponse response) throws Exception {
User user = HrmUserVarify.getUser(request, response); User user = HrmUserVarify.getUser(request, response);
Map<String, Object> map = ParamUtil.request2Map(request); Map<String, Object> map = ParamUtil.request2Map(request);
SearchTreeParams params = JSONObject.toJavaObject((JSON) JSONObject.toJSON(map), SearchTreeParams.class); // type: 0:合并 1不合并
return getPersonnelResumeWrapper(user).downloadPerResume(params); Integer type = Integer.parseInt(Util.null2String(map.get("type")));
String realPath = getPersonnelResumeWrapper(user).downloadPerResume(type,response);
File file = new File(realPath);
// 如果文件不存在提示404
if (!file.exists()) {
return Response.status(Response.Status.NOT_FOUND).build();
}
String fileName = URLEncoder.encode(file.getName(), "UTF-8");
return Response
.ok(file)
.header("Content-disposition", "attachment;filename=" + fileName)
.header("Cache-Control", "no-cache").build();
} }
} }

@ -8,6 +8,7 @@ import com.engine.organization.util.OrganizationWrapper;
import tebie.applib.api.O; import tebie.applib.api.O;
import weaver.hrm.User; import weaver.hrm.User;
import javax.servlet.http.HttpServletResponse;
import java.util.Map; import java.util.Map;
/** /**
@ -32,7 +33,7 @@ public class PersonnelResumeWrapper extends OrganizationWrapper {
return getPersonnelResumeService(user).getResumeList(uId); return getPersonnelResumeService(user).getResumeList(uId);
} }
public Map<String, Object> downloadPerResume(SearchTreeParams params) { public String downloadPerResume(Integer type, HttpServletResponse response) throws Exception {
return getPersonnelResumeService(user).downloadPerResume(params); return getPersonnelResumeService(user).downloadPerResume(type, response);
} }
} }

Loading…
Cancel
Save