CsvWriter.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.skyversation.poiaddr.util;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.*;
  5. public class CsvWriter {
  6. /**
  7. * 将 List<Map<String, Object>> 类型的数据写入 CSV 文件
  8. * @param data 要写入的数据
  9. * @param filePath CSV 文件的保存路径
  10. * @throws IOException 如果写入文件时发生 I/O 错误
  11. */
  12. public static void writeToCsv(List<Map<String, Object>> data, String filePath) throws IOException {
  13. if (data == null || data.isEmpty()) {
  14. return;
  15. }
  16. // 获取所有的列名
  17. Set<String> headers = new LinkedHashSet<>();
  18. for (Map<String, Object> row : data) {
  19. headers.addAll(row.keySet());
  20. }
  21. // 将列名写入 CSV 文件
  22. try (FileWriter writer = new FileWriter(filePath)) {
  23. writeLine(writer, new ArrayList<>(headers));
  24. // 遍历数据,将每一行写入 CSV 文件
  25. for (Map<String, Object> row : data) {
  26. List<String> values = new ArrayList<>();
  27. for (String header : headers) {
  28. Object value = row.get(header);
  29. values.add(value != null ? value.toString() : "");
  30. }
  31. writeLine(writer, values);
  32. }
  33. }
  34. }
  35. /**
  36. * 将一行数据写入 CSV 文件
  37. * @param writer 文件写入器
  38. * @param values 一行数据的值
  39. * @throws IOException 如果写入文件时发生 I/O 错误
  40. */
  41. private static void writeLine(FileWriter writer, List<String> values) throws IOException {
  42. boolean firstValue = true;
  43. for (String value : values) {
  44. if (!firstValue) {
  45. writer.append(",");
  46. }
  47. writer.append(escapeCsv(value));
  48. firstValue = false;
  49. }
  50. writer.append("\n");
  51. }
  52. /**
  53. * 转义 CSV 中的特殊字符
  54. * @param value 要转义的值
  55. * @return 转义后的字符串
  56. */
  57. private static String escapeCsv(String value) {
  58. if (value == null) {
  59. return "";
  60. }
  61. boolean needsQuotes = value.contains(",") || value.contains("\"") || value.contains("\n");
  62. if (needsQuotes) {
  63. value = value.replace("\"", "\"\"");
  64. return "\"" + value + "\"";
  65. }
  66. return value;
  67. }
  68. public static void main(String[] args) {
  69. List<Map<String, Object>> data = new ArrayList<>();
  70. Map<String,Object> item = new HashMap<>();
  71. item.put("列名1","test00");
  72. item.put("列名3","test02");
  73. Map<String,Object> item2 = new HashMap<>();
  74. item2.put("列名2","test11");
  75. item2.put("列名3","test12");
  76. data.add(item);
  77. data.add(item2);
  78. // 这里可以添加测试数据
  79. try {
  80. writeToCsv(data, "C:\\Users\\Liumouren\\Desktop\\outputTest.csv");
  81. System.out.println("CSV 文件写入成功!");
  82. } catch (IOException e) {
  83. System.err.println("写入 CSV 文件时发生错误:" + e.getMessage());
  84. }
  85. }
  86. }