java导出txt文件列对齐
转自这里,测试有效
最近做项目有一个需要用到导出txt文件的地方,内容大概就是一个把list数据类型格式的数据导出到txt文件,但是txt的排版是一个令人头疼的事情,以往这样的一般都是导出excel。但是需求不一样,选择的技术也不一样,这次仅仅是给用户下载下来简单的看看,不需要做什么报表统计的,所以选择txt下载无疑是更好的。但是一直不知道怎么让每列对齐,所以就出现了下面这样的情况。
思路
思路其实很简单,就是跟html画表格一样,考虑到表格中的每列的宽度都是固定的。那我们导出的时候也把每列宽度都固定不就行了吗。假设每列宽度最大为20个字符,那么我们就把这一列宽度设置为20个字符,不足20的用空格填充。不多说了,下面贴代码。
public static String appentStr4Length(String str , int length){if(str == null){str = "";}try {int strLen = 0;//计算原字符串所占长度,规定中文占两个,其他占一个for(int i = 0 ; i<str.length(); i++){if(isChinese(str.charAt(i))){strLen = strLen + 2;}else{strLen = strLen + 1;}}if(strLen>=length){return str;}int remain = length - strLen;//计算所需补充空格长度for(int i =0 ; i< remain ;i++){str = str + " ";}} catch (Exception e) {e.printStackTrace();}return str;}// 根据Unicode编码完美的判断中文汉字和符号private static boolean isChinese(char c) {Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {return true;}return false;}//大概用法
HttpServletResponse response = getHttpServletResponse();// filename指定默认的名字BufferedOutputStream buff = null; StringBuffer write = new StringBuffer(); String tab = "\t\t"; String enter = "\r\n"; ServletOutputStream outStr = null; response.setContentType("text/plain");// 一下两行关键的设置response.addHeader("Content-Disposition", "attachment;filename="+DateUtil.formatDateTime(DateUtil.DF_YMDHMS, new Date())+".txt");try {outStr = response.getOutputStream();// 建立 buff = new BufferedOutputStream(outStr); Map<String, Object> listMap = service.getPaymentBatchDetailListById(map);List<PaymentBatchDetailDto> resultList = new ArrayList<PaymentBatchDetailDto>();resultList = (List<PaymentBatchDetailDto>) listMap.get("list");int length = 20;if (null != resultList && resultList.size() > 0) {write.append(appentStr4Length("平台订单号",length));//write.append(tab);write.append(appentStr4Length("商户订单号",length));//write.append(tab);write.append(appentStr4Length("商户批次号",length));//write.append(tab);write.append(appentStr4Length("账号",30));//write.append(tab);write.append(appentStr4Length("账户名称",length));//write.append(tab);write.append(appentStr4Length("账户类型",length));//write.append(tab);write.append(appentStr4Length("金额",length));//write.append(tab);write.append(appentStr4Length("状态 ",length));//write.append(tab);write.append(appentStr4Length("手续费",length));//write.append(tab);write.append(appentStr4Length("支付类型",length));//write.append(tab);write.append(appentStr4Length("创建日期",length));//write.append(tab);write.append(appentStr4Length("失败原因",length));write.append(enter);write.append("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ");write.append(enter);CharHidden hidden = new CharHidden();for(int i = 0;i<resultList.size();i++){final PaymentBatchDetailDto p = resultList.get(i);write.append(appentStr4Length(p.getId(),length)); //平台订单号 //write.append(tab);write.append(appentStr4Length(p.getMchtBatchNo(),length));商户订单号//write.append(tab);write.append(appentStr4Length(p.getMchtBatchNo(),length));//商户批次号//write.append(tab);write.append(appentStr4Length(hidden.exec(new ArrayList<String>(){{add(p.getAccountNo());}}).toString(),30));//账号//write.append(tab); write.append(appentStr4Length(p.getAccountName(),length));//账户名称//write.append(tab);write.append(appentStr4Length(p.getAccountType(),length));//账户类型//write.append(tab);write.append(appentStr4Length(p.getAmount(),length));//金额//write.append(tab);write.append(appentStr4Length(p.getStatus(),length));//状态//write.append(tab);write.append(appentStr4Length(p.getFee(),length));//手续费//write.append(tab);write.append(appentStr4Length(p.getPaymentBusinessType(),length));//支付类型//write.append(tab);write.append(appentStr4Length(p.getCreatedDate(),length));//创建日期//write.append(tab);write.append(appentStr4Length(p.getResponseMsg(),length));//失败原因write.append(enter);}buff.write(write.toString().getBytes("UTF-8")); buff.flush(); buff.close(); } else {throw new MemberServiceException(EMemberError.E0001.name(),EMemberError.E0001.getValue());}} catch (Exception e) {MessageBean messageBean = new MessageBean();messageBean.setType(MessageBean.TYPE_EXCEPTION);messageBean.setObject(0, MessageBean.EXCEPTION_LEVEL_ERROR);messageBean.setObject(1, MchtDateUtil.formatCurrDateTime(MchtDateUtil.DF_Y_M_D_HMS));messageBean.setObject(2, "ops-mcht-app");messageBean.setObject(3, "支付批次明细");messageBean.setObject(4, "com.smartpay.ops.mcht.view.agencyPay.AgencyPayController");messageBean.setObject(5, "代付支付批次明细下载异常");// end monitorLoggerUtil.error(messageBean.toString());LoggerUtil.error(e);try {buff.write(e.getMessage().getBytes());} catch (IOException e1) {e1.printStackTrace();}}finally{try { buff.close(); outStr.close(); } catch (Exception e) { e.printStackTrace(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
再说两句
计算字符的时候,由于发现在txt文件中中文占的宽度是英文字符的两倍,所以统计的时候要把中文宽度值记为2,英文为1,最后计算出要补充的空格字符。
java导出txt文件列对齐相关推荐
- js和java导出txt文件怎么打开文件_JS本地文件操作,JS读写txt文件
/** * object.OpenTextFile(filename[, iomode[, create[, format]]]) * * 参数: * object 必选项.object 应为 Fil ...
- java 导入导出txt文件_Java读取和写入txt文件
1 问题描述 对于java的读取和写入txt一直心存疑惑,随着知识的积累,又重新进行学习,对java的文件读写理解更加深刻,在这里将自己的小小经验总结分享给大家.下面是大家了解java流的一个基本框架 ...
- 使用java导出pdf文件
使用java导出pdf文件 itext itext的使用 JasperReports JasperReports与itext的区别 Jaspersoft Studio 工具简介 Jaspersoft ...
- java导出excel文件(标题为中文乱码)
1 Java导出Excel文件 function excelOut(){ window.location.href="../getFileToExcel/"+taskId; } ...
- Java读取txt文件、excel文件的方法
Java读取txt文件.excel文件的方法 1.读取txt文件 public static String getFileContent(String filePath,String charset) ...
- java读取txt文件中的内容
java读取txt文档中的内容:在这个地方我们输入一个txt文件的路径,就可以读取出txt文档中的内容: public static String readStringFromtxt(String t ...
- java读取txt文件
java如何读入txt文本文件的内容:java从txt文件中读取内容有多种方法,包括按照行读取文件,按照字节读取文件,首先我们来看看按照行读取txt文件中的内容的一般的步骤: 首先是我们创建一个fil ...
- JAVA编程TXT文件_java读写txt文件的方法
java读写txt文件的方法 发布时间:2020-06-26 15:54:02 来源:亿速云 阅读:111 作者:Leah 本篇文章为大家展示了java读写txt文件的方法,代码简明扼要并且容易理解, ...
- [java进阶]1.Java读取txt文件和写入txt文件
1. Java读取txt文件 import java.io.*; import java.util.ArrayList; import java.util.List;public class unit ...
最新文章
- 从内存溢出看Java 环境中的内存结构
- iAD靠什么吸引用户打开这个应用?
- 员工考勤信息管理小程序
- vue之登录和token处理
- 硬盘坏道拷贝软件_什么是数据恢复工具,一款一键恢复软件
- jsp医院管理系统_Thymeleaf+SpringBoot+SpringDataJPA实现的中小医院信息管理系统
- latex中算法命令_比较Java 8中的命令式和功能性算法
- 怎么验证proftpd安装成功_英雄联盟手游泰服安卓账号怎么注册
- C#生成不重复随机数列表
- 1.4. network
- Myeclipse字符集设置
- ORA-01033错误解决方法
- leetcode-53-maxium subarray
- 更新提示!Chrome新的零日漏洞正被利用
- 安卓开发教你监听手机Home键
- 全球多地爆发!传染性极强!鄂尔多斯人近期外出一定要注意…
- 【如何配置环境变量】
- 游戏搜索引擎 - 6617.com 内测,欢迎大家点评 :)
- Java是什么软件-详细解答Java到底是什么
- Composer开启多线程组件改变composer缓慢问题