在线报表FineReport7.1.1
大小:148.2M 适用平台:windows/linux
编写自定义函数Commit3.java源文件代码具体如下:package com.fr.data; import java.io.*;import java.util.logging.Level;import java.util.logging.Logger;import java.io.FileOutputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.*;import com.fr.base.FRContext;import com.fr.base.Formula;import com.fr.cache.Attachment;import com.fr.data.ClassSubmitJob;import com.fr.data.SubmitJob;import com.fr.data.impl.SubmitJobValue;import com.fr.general.FArray;import com.fr.general.FRLogManager;import com.fr.general.FRLogger;import com.fr.script.Calculator;import com.fr.stable.UtilEvalError;import com.fr.stable.xml.XMLPrintWriter;import com.fr.stable.xml.XMLableReader;public class Commit3 implements SubmitJob { private Object attach; private SubmitJobValue filePath; //定义文件路径 public Object clone() throws CloneNotSupportedException { return super.clone(); }public void doJob(Calculator ca) throws Exception {FRContext.getLogger().info('begin to upload file...');final Object attachO = attach;if (attachO instanceof FArray && ((FArray) attachO).length() != 0) {new Thread() {public void run() {int i;FArray attachmentlist = (FArray) attachO;for (i = 0; i < attachmentlist.length(); i++) {if (!(attachmentlist.elementAt(i) instanceof Attachment)) {continue;} else {FRContext.getLogger().info('filePath.value:' + filePath.getValue().toString());FRContext.getLogger().info('filePath.valueState:' + filePath.getValueState() +'注:valueState 0,1,2,3 分别表示 默认值,插入行,值改变,删除行');String FilePath = filePath.getValue().toString();String FileName = ((Attachment) (attachmentlist.elementAt(i))).getFilename();String Path = FilePath + '\\' + FileName;File fileDir = new File(FilePath);if (!fileDir.exists()) {fileDir.mkdirs();}try {mkfile(FilePath, FileName, new java.io.ByteArrayInputStream(((Attachment) (attachmentlist.elementAt(i))).getBytes())); //新建文件夹,并且写入内} catch (Exception e) {Logger.getLogger('FR').log(Level.WARNING,e.getMessage() + '/nmkfileerror', e);}}}}}.start();}} private static void mkfile(String path, String FileName, java.io.InputStream source) throws FileNotFoundException, IOException { File fileout = new File(path, FileName); if (fileout.exists()) {// 检查是否存在 fileout.delete();// 删除文件FRContext.getLogger().info('old file deleted'); } // 在当前目录下建立一个名为FileName的文件 if(fileout.createNewFile()) {FRContext.getLogger().info(path + FileName + 'created!!');} FileOutputStream outputStream = new FileOutputStream(fileout); byte[] bytes = new byte[1024]; int read=source.read(bytes); while (read!=-1) { outputStream.write(bytes, 0, read); outputStream.flush(); read = source.read(bytes); } outputStream.close(); //把source写入新建的文件 } public void readXML(XMLableReader reader) { // TODO Auto-generated method stub } public void writeXML(XMLPrintWriter writer) { }@Overridepublic void doFinish(Calculator arg0) throws Exception {// TODO Auto-generated method stub}}
编译自定义函数将编译后的Commit3.class和Commit3$1.class放在FineReport的安装目录WEB-INF下面的classes目录下,由于Commit3.java属于包com.fr.data,因此Commit3.class和Commit3$1.class需要放置在classes\com\fr\data目录下。
定义模板表样设置按照下图设置表样:A1单元格的控件类型为文件上传控件,控件名为attach;B1单元格的控件类型为按钮,按钮名字为上传,点击该按钮时,将文件上传;C1单元格的控件类型为文本框,获取上传文件名称,使用公式filename(A1);在D1单元格中输入文件要上传的路径,控件设置为不可见。
自定义函数调用及入库处理给B1按钮增加个点击事件,选择提交入库,进行如下图设置:
设置后,点击设置提交事件按钮,然后增加自定义提交事件,点击“+”按钮,选择自定义事件,然后选择com\fr\data\commit3.class,点击增加属性按钮,添加2个属性,名字分别为attach和filePath(与commit3.java中定义的文件路径名相同),值选择分别为公式A1和单元格D1,其效果如下图:注:由于attach在Commit3.java中定义的是object对象,所以其属性值只能是公式F(x)=A1,不能选择单元格,然后输入A1,而filePath在Commit3.java中定义的是SubmitJobValue,所以其属性值类型只能是单元格,然后选择具体对应的哪个单元格,如上图的形式,不能写公式。
预览点击填报预览,点击文件上传控件,选择完文件后,点击上传文件按钮即可将对应的文件上传到指定的目录下了。