锐浪报表-实现导入导出

锐浪报表-实现导入导出

实现思路

  • 导入导出实现思路:
    我们使用锐浪报表自带的导出功能导出 XX.grf 后,鼠标右键是可以像编辑文本一样编辑内容的.由此联想到,用记事本手写一个模板改一下后缀名是不是也可以当作报表模板.答案是可以的(不信你去试一下).所以我们做导入导出就可以像文本的导入导出一样.而且文本可以通过json格式化,我们就可以操作模板里面的属性.

代码实现

  • 导出代码实现
public void expReport() {
		reportInfo = DaoFactory.getReportManageDao().getReport(id);
		HttpServletResponse response = Struts2Utils.getResponse();
		response.setContentType("grf/plain");
		response.addHeader("Content-Disposition",
				"attachment;filename=" + genAttachmentFileName(reportInfo.getName(), "JSON_FOR_UCC_") + ".grf");
		BufferedOutputStream buff = null;
		ServletOutputStream outStr = null;
		try {
			outStr = response.getOutputStream();
			buff = new BufferedOutputStream(outStr);
			buff.write(reportInfo.getFile().getBytes("UTF-8"));
			buff.flush();
			buff.close();
		} catch (Exception e) {
			e.printStackTrace();
			LOGGER.error("导出文件文件出错:{}",e);
		} finally {
			try {
				buff.close();
				outStr.close();
			} catch (Exception e) {
				e.printStackTrace();
				LOGGER.error("关闭流对象出错 e:{}",e);
			}
		}
	}
	//处理文件名
	public String genAttachmentFileName(String cnName, String defaultName) {
		try {
			cnName = new String(cnName.getBytes("gb2312"), "ISO8859-1");
		} catch (Exception e) {
			e.printStackTrace();
			cnName = defaultName;
		}
		return cnName;
	}
  • 导入代码实现
@Transactional
public void importReport(ReportInfo reportInfo,File uploadReportFile){
	log.debug("reportDao:importReport--start---");
	log.debug("文件大小:"+uploadReportFile.length()/1024+"KB");
	//这个字符处理是重点
	String file = txt2String(uploadReportFile);
	JSONObject json = JSONObject.parseObject(file);
	//**********************以下内容是为了满足业务逻辑,可以参考但是与导入无关***************************//
	String storageId = reportInfo.getStorageId();
	//获取明细网格内的字段
	JSONArray jsonArray = json.getJSONObject("DetailGrid").getJSONObject("Recordset").getJSONArray("Field");
	Long sId = DBUtils.toLong(storageId);
	Storage storage = DaoFactory.getStorageDao().get(sId);
	List<Map<String,Object>> tableColumn = DaoFactory.getReportManageDao().getTableColumn("'"+storage.getTableName()+"'");
	String column_E="";
	for (int i = 0; i < jsonArray.size(); i++) {
		String reportC = jsonArray.getJSONObject(i).getString("Name");
		for (Map<String, Object> map : tableColumn) {
			String tableC = DBUtils.toString(map.get("LI"));
			if(reportC.equals(tableC)){
				column_E +=tableC + ",";
			}
		}
	}	
	column_E = column_E.substring(0, column_E.length()-1);
	reportInfo.setEnglishField(column_E);
	//**********************以上内容是为了满足业务逻辑,可以参考但是与导入无关***************************//
	reportInfo.setFile(file);
	DaoFactory.getReportManageDao().insert(reportInfo);
	log.debug("reportDao:importReport--end---");
}
  • 文件字符处理
 public static String txt2String(File file){
	  StringBuilder result = new StringBuilder();
	  try {
		  String line;
		  BufferedReader br=new BufferedReader(new UnicodeReader(new FileInputStream(file),"UTF-8"));  
		  line = br.readLine();
		  while (line != null) {
			   result.append(line);
			   result.append("\n");
			   line = br.readLine();
		  }
		  br.close();
	  } catch (FileNotFoundException e) {
		  e.printStackTrace();
	  }catch (IOException e) {
		  e.printStackTrace();
	  }
	  return result.toString();
  }
  • UnicodeReader类
    这个类是国外一位大神写的,为了解决UTF-8的BOM问题
public class UnicodeReader extends Reader{
	PushbackInputStream internalIn;
	InputStreamReader internalIn2 = null;
	String defaultEnc;
 
	private static final int BOM_SIZE = 4;
 
	/**
	 * 
	 * @param in
	 *            inputstream to be read
	 * @param defaultEnc
	 *            default encoding if stream does not have BOM marker. Give NULL
	 *            to use system-level default.
	 */
	UnicodeReader(InputStream in, String defaultEnc) {
		internalIn = new PushbackInputStream(in, BOM_SIZE);
		this.defaultEnc = defaultEnc;
	}
 
	public String getDefaultEncoding() {
		return defaultEnc;
	}
 
	/**
	 * Get stream encoding or NULL if stream is uninitialized. Call init() or
	 * read() method to initialize it.
	 */
	public String getEncoding() {
		if (internalIn2 == null)
			return null;
		return internalIn2.getEncoding();
	}
 
	/**
	 * Read-ahead four bytes and check for BOM marks. Extra bytes are unread
	 * back to the stream, only BOM bytes are skipped.
	 */
	protected void init() throws IOException {
		if (internalIn2 != null)
			return;
 
		String encoding;
		byte bom[] = new byte[BOM_SIZE];
		int n, unread;
		n = internalIn.read(bom, 0, bom.length);
 
		if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00)
				&& (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
			encoding = "UTF-32BE";
			unread = n - 4;
		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)
				&& (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
			encoding = "UTF-32LE";
			unread = n - 4;
		} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB)
				&& (bom[2] == (byte) 0xBF)) {
			encoding = "UTF-8";
			unread = n - 3;
		} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
			encoding = "UTF-16BE";
			unread = n - 2;
		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
			encoding = "UTF-16LE";
			unread = n - 2;
		} else {
			// Unicode BOM mark not found, unread all bytes
			encoding = defaultEnc;
			unread = n;
		}
		// System.out.println("read=" + n + ", unread=" + unread);
 
		if (unread > 0)
			internalIn.unread(bom, (n - unread), unread);
 
		// Use given encoding
		if (encoding == null) {
			internalIn2 = new InputStreamReader(internalIn);
		} else {
			internalIn2 = new InputStreamReader(internalIn, encoding);
		}
	}
 
	public void close() throws IOException {
		init();
		internalIn2.close();
	}
 
	public int read(char[] cbuf, int off, int len) throws IOException {
		init();
		return internalIn2.read(cbuf, off, len);
	}
}

我不生产代码,我只是代码的搬运工!

如果大家有什么不懂的可以私信.我看到了就会回复的.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值