实现思路
- 导入导出实现思路:
我们使用锐浪报表自带的导出功能导出 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);
}
}
我不生产代码,我只是代码的搬运工!
如果大家有什么不懂的可以私信.我看到了就会回复的.