用java语言实现word导出文档服务

一· 需要制作一个需要导出的word文档模板(使用wps导出xml(2003))然后将文件后缀名给为ftl----------------将文件xx.ftl放在后台代码的静态资源目录下(也就是template下)

将其正你所需要填写字段通过${字段名}代替

二·进行java代码的开发

@RestController
@AllArgsConstructor
@RequestMapping("/word")
public class WordExportController {
private IWordExportService iWordExportService;

/**
* 获取文档数据
*
* @param request 请求参数
* @param response 响应
*/
@PostMapping("detail")
你所需填入的数据对象通过request参数传入
public void wordExport(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> dataMap = new HashMap<>(20);
iWordExportService.getData(dataMap, request);
String dir = System.getProperty("user.dir");
String annualReportPath = dir + File.separator + "blade-service" + File.separator + "blade-word-export" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "template";
File path = new File(annualReportPath);
if (!path.exists()) {
annualReportPath = dir + File.separator + "template";
}
String templateFile = annualReportPath + "\xx.ftl";
String exportFile = annualReportPath + "\xx.doc";
try {
iWordExportService.getInstance().createDocFile(templateFile, dataMap, exportFile, 1);
iWordExportService.downloadFile(exportFile, "xx.doc", request, response);
} catch (Exception e) {
e.printStackTrace();
}
}


}

//Service接口

public interface IWordExportService {
/**
* 导出文档
*
* @param templateFilePath 模板文件路径
* @param dataMap 数据
* @param exportFilePath 下载文件路径
* @param loadType 文件加载模式
* @return file
* @throws Exception 异常信息
*/
File createDocFile(String templateFilePath, Map<String, Object> dataMap, String exportFilePath, int loadType) throws Exception;

/**
* 文件下载
*
* @param resourcepath 资源路径
* @param filename 文件名
* @param request 请求地址
* @param response 请求地址
*/
void downloadFile(String resourcepath, String filename, HttpServletRequest request, HttpServletResponse response);

/**
* 设置文档数据
*
* @param dataMap 数据
*/
void getData(Map<String, Object> dataMap, HttpServletRequest request);

/**
* sdfsd
*
* @return file
*/
IWisdomWordExportService getInstance();
}
//ServiceImpl实现类
@Service
public class IWordExportServiceImpl implements IWordExportService {
private static Logger LOGGER = LoggerFactory.getLogger(WordExportApplication.class);
private static String diagonal = "\";
private static String http = "http";
private static IWordExportServiceImpl service = null;
private static Log log = LogFactory.getLog(WordExportApplication.class);

private IWordExportServiceImpl() {
super();
}

@Override
public IWordExportServiceImpl getInstance() {
if (service == null) {
synchronized (WordExportApplication.class) {
if (service == null) {
service = new IWordExportServiceImpl();
}
}
}
return service;
}

@Override
public File createDocFile(String templateFilePath, Map<String, Object> dataMap, String exportFilePath, int loadType) throws Exception {
Template t;
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
configuration.setDefaultEncoding("UTF-8");
try {
templateFilePath = pathReplace(templateFilePath);
String ftlPath = templateFilePath.substring(0, templateFilePath.lastIndexOf("/"));
if (loadType == 1) {
// FTL文件所存在的位置
configuration.setDirectoryForTemplateLoading(new File(ftlPath));
} else {
//以类加载的方式查找模版文件路径
configuration.setClassForTemplateLoading(this.getClass(), ftlPath);
}


String ftlFile = templateFilePath.substring(templateFilePath.lastIndexOf("/") + 1);
// 模板文件名
t = configuration.getTemplate(ftlFile);

File outFile = new File(exportFilePath);
Writer out;

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));

t.process(dataMap, out);
} catch (Exception e) {
LOGGER.error("导出word文档出错", e);
throw e;
}

return null;
}

@Override
public void downloadFile(String resourcepath, String filename, HttpServletRequest request, HttpServletResponse response) {
FileInputStream fis = null;
OutputStream out = null;
if (StringUtil.isNotEmpty(filename) && StringUtil.isNotEmpty(resourcepath)) {
try {
filename = new String(filename.getBytes(StandardCharsets.UTF_8), "ISO8859-1");
String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF");
realPath = realPath.replace("\hrm\WEB-INF", "");
realPath.trim();
fis = new FileInputStream(new File(resourcepath));
//设置响应头和保存文件名
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
//写出流信息
int b;
out = response.getOutputStream();
byte[] buf = new byte[1024];
while (-1 != (b = fis.read(buf))) {
out.write(buf, 0, b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fis.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


/**
* 把路径的替换成/
*
* @param path 替换前路径
* @return 替换后路径
*/
private String pathReplace(String path) {
while (path != null && path.contains(diagonal)) {
path = path.replace("\", "/");
}
return path;
}

/**
* 测试用的
*
* @param dataMap 数据
*/
@Override
public void getData(Map<String, Object> dataMap, HttpServletRequest request) {
System.out.println(request.getParameter("area1"));
dataMap.put("titleName", request.getParameter("titleName") == null ? "xx" : request.getParameter("titleName"));
dataMap.put("area", request.getParameter("area") == null ? "0" : request.getParameter("area"));
dataMap.put("number1", request.getParameter("number1") == null ? "1" : request.getParameter("number1"));
dataMap.put("index1", request.getParameter("index1") == null ? "无" : request.getParameter("index1"));
dataMap.put("amount1", request.getParameter("amount1") == null ? "0" : request.getParameter("amount1"));
dataMap.put("area1", request.getParameter("area1") == null ? "0" : request.getParameter("area1"));
dataMap.put("percentage1", request.getParameter("percentage1") == null ? "0.00%" : request.getParameter("percentage1"));
dataMap.put("number2", request.getParameter("number2") == null ? "1" : request.getParameter("number2"));
dataMap.put("index2", request.getParameter("index2") == null ? "无" : request.getParameter("number2"));
dataMap.put("amount2", request.getParameter("amount2") == null ? "0" : request.getParameter("amount2"));
dataMap.put("area2", request.getParameter("area2") == null ? "0" : request.getParameter("area2"));
dataMap.put("percentage2", request.getParameter("percentage2") == null ? "0.00%" : request.getParameter("percentage3"));
dataMap.put("number3", request.getParameter("number3") == null ? "1" : request.getParameter("number3"));
dataMap.put("index3", request.getParameter("index3") == null ? "无" : request.getParameter("number3"));
dataMap.put("amount3", request.getParameter("amount3") == null ? "0" : request.getParameter("amount3"));
dataMap.put("area3", request.getParameter("area3") == null ? "0" : request.getParameter("area3"));
dataMap.put("percentage3", request.getParameter("percentage3") == null ? "0.00%" : request.getParameter("percentage3"));
dataMap.put("number4", request.getParameter("number4") == null ? "1" : request.getParameter("number4"));
dataMap.put("index4", request.getParameter("index4") == null ? "无" : request.getParameter("number4"));
dataMap.put("amount4", request.getParameter("amount4") == null ? "0" : request.getParameter("amount4"));
dataMap.put("area4", request.getParameter("area4") == null ? "0" : request.getParameter("area4"));
dataMap.put("percentage4", request.getParameter("percentage4") == null ? "0.00%" : request.getParameter("percentage4"));
dataMap.put("number5", request.getParameter("number5") == null ? "1" : request.getParameter("number5"));
dataMap.put("index5", request.getParameter("index5") == null ? "无" : request.getParameter("number5"));
dataMap.put("amount5", request.getParameter("amount5") == null ? "0" : request.getParameter("amount5"));
dataMap.put("area5", request.getParameter("area5") == null ? "0" : request.getParameter("area5"));
dataMap.put("percentage5", request.getParameter("percentage5") == null ? "0.00%" : request.getParameter("percentage5"));
dataMap.put("number6", request.getParameter("number6") == null ? "1" : request.getParameter("number6"));
dataMap.put("index6", request.getParameter("index6") == null ? "无" : request.getParameter("number6"));
dataMap.put("amount6", request.getParameter("amount6") == null ? "0" : request.getParameter("amount6"));
dataMap.put("area6", request.getParameter("area6") == null ? "0" : request.getParameter("area6"));
dataMap.put("percentage6", request.getParameter("percentage6") == null ? "0.00%" : request.getParameter("percentage6"));
dataMap.put("number7", request.getParameter("number7") == null ? "1" : request.getParameter("number7"));
dataMap.put("index7", request.getParameter("index7") == null ? "无" : request.getParameter("number7"));
dataMap.put("amount7", request.getParameter("amount7") == null ? "0" : request.getParameter("amount7"));
dataMap.put("area7", request.getParameter("area7") == null ? "0" : request.getParameter("area7"));
dataMap.put("percentage7", request.getParameter("percentage7") == null ? "0.00%" : request.getParameter("percentage7"));

}

private String getImageStr(String imgFile) {

InputStream in;
byte[] data = null;
try {
//获取在线图片
if (imgFile.startsWith(http)) {
URL url = new URL(imgFile);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5 * 1000);
in = conn.getInputStream();
} else { //获取线下图片
in = new FileInputStream(imgFile);
}
int c;
ByteArrayOutputStream buff = new ByteArrayOutputStream();
while ((c = in.read()) >= 0) {
buff.write(c);
}
data = buff.toByteArray();
buff.close();
in.read(data);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
if (data != null && data.length > 0) {
return encoder.encode(data);
}
return null;
}
}


原文地址:https://www.cnblogs.com/robotsu/p/13578225.html