转自这里,测试有效

最近做项目有一个需要用到导出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文件列对齐相关推荐

  1. js和java导出txt文件怎么打开文件_JS本地文件操作,JS读写txt文件

    /** * object.OpenTextFile(filename[, iomode[, create[, format]]]) * * 参数: * object 必选项.object 应为 Fil ...

  2. java 导入导出txt文件_Java读取和写入txt文件

    1 问题描述 对于java的读取和写入txt一直心存疑惑,随着知识的积累,又重新进行学习,对java的文件读写理解更加深刻,在这里将自己的小小经验总结分享给大家.下面是大家了解java流的一个基本框架 ...

  3. 使用java导出pdf文件

    使用java导出pdf文件 itext itext的使用 JasperReports JasperReports与itext的区别 Jaspersoft Studio 工具简介 Jaspersoft ...

  4. java导出excel文件(标题为中文乱码)

    1 Java导出Excel文件 function excelOut(){   window.location.href="../getFileToExcel/"+taskId; } ...

  5. Java读取txt文件、excel文件的方法

    Java读取txt文件.excel文件的方法 1.读取txt文件 public static String getFileContent(String filePath,String charset) ...

  6. java读取txt文件中的内容

    java读取txt文档中的内容:在这个地方我们输入一个txt文件的路径,就可以读取出txt文档中的内容: public static String readStringFromtxt(String t ...

  7. java读取txt文件

    java如何读入txt文本文件的内容:java从txt文件中读取内容有多种方法,包括按照行读取文件,按照字节读取文件,首先我们来看看按照行读取txt文件中的内容的一般的步骤: 首先是我们创建一个fil ...

  8. JAVA编程TXT文件_java读写txt文件的方法

    java读写txt文件的方法 发布时间:2020-06-26 15:54:02 来源:亿速云 阅读:111 作者:Leah 本篇文章为大家展示了java读写txt文件的方法,代码简明扼要并且容易理解, ...

  9. [java进阶]1.Java读取txt文件和写入txt文件

    1. Java读取txt文件 import java.io.*; import java.util.ArrayList; import java.util.List;public class unit ...

最新文章

  1. 从内存溢出看Java 环境中的内存结构
  2. iAD靠什么吸引用户打开这个应用?
  3. 员工考勤信息管理小程序
  4. vue之登录和token处理
  5. 硬盘坏道拷贝软件_什么是数据恢复工具,一款一键恢复软件
  6. jsp医院管理系统_Thymeleaf+SpringBoot+SpringDataJPA实现的中小医院信息管理系统
  7. latex中算法命令_比较Java 8中的命令式和功能性算法
  8. 怎么验证proftpd安装成功_英雄联盟手游泰服安卓账号怎么注册
  9. C#生成不重复随机数列表
  10. 1.4. network
  11. Myeclipse字符集设置
  12. ORA-01033错误解决方法
  13. leetcode-53-maxium subarray
  14. 更新提示!Chrome新的零日漏洞正被利用
  15. 安卓开发教你监听手机Home键
  16. 全球多地爆发!传染性极强!鄂尔多斯人近期外出一定要注意…
  17. 【如何配置环境变量】
  18. 游戏搜索引擎 - 6617.com 内测,欢迎大家点评 :)
  19. Java是什么软件-详细解答Java到底是什么
  20. Composer开启多线程组件改变composer缓慢问题

热门文章

  1. 谐波减速器的结构简图及传动比说明
  2. wxj platte
  3. 28岁转行程序员?别想了、没戏。事实真就如此残酷?
  4. cesium 学习笔记(三) 在地图上放置3D建筑模型
  5. 怎么在电脑中更新statsmodels.stats. diagnostic
  6. 云计算具有哪些特点,主要分为哪几大类型?
  7. 如何高效地从BAM文件中提取fastq
  8. Tabs | jQuery UI
  9. android adb 分析,android adb shell常用脚本分析课件.ppt
  10. 怎么体现声屏障的美观性?