使用场景
Java下载预设的excel模板。
处理思路
1、配置文件模板路径:project-web.xml
<entry key="file.templetPath">/com/config/project/example/ImportTemplate.xlsx</entry>
2、配置项与类映射:applicationContext.xml
<bean id="configManager" class="com.sc.project.base.ConfigManager">
<property name="templetPath" value="${file.templetPath}"></property>
</bean>
3、配置类:ConfigManager.java
public class ConfigManager{
private String templetPath;
public String getTempletPath() {
return templetPath;
}
public void setTempletPath(String templetPath) {
this.templetPath = templetPath;
}
}
3、下载模板功能—设置导出文件名,excel字体头部格式
@RequestMapping(value = "/template/download.do")
public void downloadTemplet(HttpServletResponse response) {
try {
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + new String("导入模板".getBytes("gb2312"), "ISO8859-1") + ".xlsx");// 设置文件名
importService.downloadTemplet(response.getOutputStream());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
4、下载模板功能—读取字节流,导出excel模板
public void downloadTemplet(OutputStream outputStream) {
try {
byte[] rcBytes = getFileData(configManager.getTempletPath());
outputStream.write(rcBytes);
} catch (Exception e) {
e.printStackTrace();
logger.error("writeExample",e.getMessage(),e);
}
}
5、模板缓存:下载模板,将字节流缓存起来,key为模板路径,value为文件字节流
private Map<String,byte[]> fileDatas = new ConcurrentHashMap<String, byte[]>();
private byte[] getFileData(String filePath) throws Exception{
byte[] data = null;
if (fileDatas.containsKey(filePath)){
data = fileDatas.get(filePath);
}
if (data == null){
data = FileUtils.readFile(filePath);
fileDatas.put(filePath,data);
}
return data;
}
6、读取文件字节流工具类:FileUtils.java
public static byte[] readFile(String fileName)throws Exception{
FileInputStream fis=null;
try {
fis=new FileInputStream(fileName);
byte[] buf=new byte[fis.available()];
int readed=0;
int rv=0;
while(readed<buf.length&&(rv=fis.read(buf,readed,buf.length-readed))>0){
readed+=rv;
}
if (readed==buf.length){
return buf;
}else{
return null;
}
} finally {
if(fis!=null){
fis.close();
}
}
}