通过POI将数据库中的数据导出到本地(含将Json文件格式化的相关demo)

一、 将数据库中的数据导入到本地-----生成Json文件

 1、将数据库中的数据导出到本地生成Json文件

 1    /**
 2      * 
 3      * @param dbDataList        从数据库中查询出来的结果集,封装到List<Map>中,这里根据需求进行更改
 4      * @param path      将文件生成到本地或者指定路径下
 5      * @param fileName      生成文件的文件名
 6      * @return
 7      */
 8     public boolean createJsonFile(List<Map<String, Object>> dbDataList, String path, String fileName) {
 9         boolean flag = false;
10         Map<String, Object> map = new HashMap<>();
11         map.put("data", dbDataList);
12         JSONObject jsonObject = JSONObject.fromObject(map);
13         String jsonStr = jsonObject.toString();
14         jsonStr = JsonFormatTool.formatJson(jsonStr);
15         try {
16             //File.separator  这里指的是目录之间的分隔符,即 /
17             String fullPath = path + File.separator + fileName + ".json";
18             File file = new File(fullPath);
19             //创建文件的时候,如果该文件的父路径不存在,则创建父路径上相关的文件夹
20             if (!file.getParentFile().exists()) {
21                 file.getParentFile().mkdirs();
22             }
23             //如果需要创建的文件已经存在,删除旧的文件
24             if (file.exists()) {
25                 file.delete();
26             }
27             flag = file.createNewFile();
28             //写入内容的时候指定编码格式,避免乱码
29             Writer os = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
30             os.write(jsonStr);
31             os.flush();
32             os.close();
33         } catch (IOException e) {
34             flag = false;
35             e.printStackTrace();
36         }
37         return flag;
38     }

2、将生成的Json文件格式化的相关工具类(直接将Json字符串当做参数传递进去即可)

 1 public class JsonFormatTool {
 2     /**
 3      * 单位缩进字符串。
 4      */
 5     private static String SPACE = "   ";
 6 
 7     /**
 8      * 返回格式化JSON字符串。
 9      * 
10      * @param json 未格式化的JSON字符串。
11      * @return 格式化的JSON字符串。
12      */
13     public static String formatJson(String json) {
14         StringBuffer result = new StringBuffer();
15 
16         int length = json.length();
17         int number = 0;
18         char key = 0;
19 
20         // 遍历输入字符串。
21         for (int i = 0; i < length; i++) {
22             // 1、获取当前字符。
23             key = json.charAt(i);
24 
25             // 2、如果当前字符是前方括号、前花括号做如下处理:
26             if ((key == '[') || (key == '{')) {
27                 // (1)如字果前面还有字符,并且字符为“:”,打印:换行和缩进字符符串。
28                 if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
29                     result.append('
');
30                     result.append(indent(number));
31                 }
32 
33                 // (2)打印:当前字符。
34                 result.append(key);
35 
36                 // (3)前方括号、前花括号,的后面必须换行。打印:换行。
37                 result.append('
');
38 
39                 // (4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
40                 number++;
41                 result.append(indent(number));
42 
43                 // (5)进行下一次循环。
44                 continue;
45             }
46 
47             // 3、如果当前字符是后方括号、后花括号做如下处理:
48             if ((key == ']') || (key == '}')) {
49                 // (1)后方括号、后花括号,的前面必须换行。打印:换行。
50                 result.append('
');
51 
52                 // (2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
53                 number--;
54                 result.append(indent(number));
55 
56                 // (3)打印:当前字符。
57                 result.append(key);
58 
59                 // (4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
60                 if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
61                     result.append('
');
62                 }
63 
64                 // (5)继续下一次循环。
65                 continue;
66             }
67 
68             // 4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
69             if ((key == ',')) {
70                 result.append(key);
71                 result.append('
');
72                 result.append(indent(number));
73                 continue;
74             }
75 
76             // 5、打印:当前字符。
77             result.append(key);
78         }
79 
80         return result.toString();
81     }
82 
83     /**
84      * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
85      * 
86      * @param number 缩进次数。
87      * @return 指定缩进次数的字符串。
88      */
89     private static String indent(int number) {
90         StringBuffer result = new StringBuffer();
91         for (int i = 0; i < number; i++) {
92             result.append(SPACE);
93         }
94         return result.toString();
95     }
96 }
JSON字符串格式化工具类

 将数据库中的数据导入到本地-----生成Excel文件

 1    /**
 2      *
 3      * @param dbDataList      从数据库中查询出来的结果集,封装到List<Map>中,这里根据需求进行更改
 4      * @param path      将文件生成到本地或者指定路径下
 5      * @param fileName      生成文件的文件名
 6      */
 7     public void exportData2Excel(List<Map<String,Object>> dbDataList,String path,String fileName){
 8         try {
 9             //1.通过读取模板创建工作簿
10             Workbook sheets = new XSSFWorkbook("D:\aa\bb\我是一个excel文件.xlsx");
11             //2.获取到第二个sheet(根据需求进行更改)
12             Sheet sheet = sheets.getSheetAt(1);
13             //3.提取正文的样式
14             String sheetName = sheet.getSheetName();
15             CellStyle css [] = new CellStyle[7];  //css[0] 这里注意模板中格子的位置
16             Row row = sheet.getRow(2);//具体根据excel中的模板决定到底需要从第几行开始录入数据
17             for (int i = 1; i < css.length; i++) {
18                 Cell cell = row.getCell(i);
19                 css[i] = cell.getCellStyle();  //获取指定cell格子所具备的样式,存储到CellStyle数组中。
20             }
21             //4.循环创建所有的正文的单元格数据行
22             int index = 1;
23             for (Map<String,Object> data : dbDataList) {
24                 row = sheet.createRow(index++);
25                 //EXCEL编号
26                 Cell cell = row.createCell(1);//如果格子中没有值的话,这里会报空指针异常
27                 cell.setCellValue((String) data.get("Map集合中的key1"));
28                 cell.setCellStyle(css[1]);
29                 //sheet名称
30                 cell = row.createCell(2);
31                 cell.setCellValue((String) data.get("map集合中的key2"));
32                 cell.setCellStyle(css[2]);
33                 //Cell位置
34                 cell = row.createCell(3);
35                 cell.setCellValue((String) data.get("key3"));
36                 cell.setCellStyle(css[3]);
37                 //指标编码
38                 cell = row.createCell(4);
39                 cell.setCellValue((String) data.get("key4"));
40                 cell.setCellStyle(css[4]);
41                 //维度1
42                 cell = row.createCell(5);
43                 cell.setCellValue((String) data.get("key5"));
44                 cell.setCellStyle(css[5]);
45                 //
46                 cell = row.createCell(6);
47                 cell.setCellValue((String) data.get("key6"));
48                 cell.setCellStyle(css[6]);
57             }
58             //File.separator  这里指的是目录之间的分隔符,即 /
59             String fullPath = path + File.separator + fileName + ".xlsx";
60             File file = new File(fullPath);
61             //创建文件的时候,如果该文件的父路径不存在,则创建父路径上相关的文件夹
62             if (!file.getParentFile().exists()) {
63                 file.getParentFile().mkdirs();
64             }
65             //如果需要创建的文件已经存在,删除旧的文件
66             if (file.exists()) {
67                 file.delete();
68             }
69             //将文件读成流,用Workbook将流写到本地
70             FileOutputStream os = new FileOutputStream(file);
71             sheets.write(os);
72             os.close();
73         } catch (IOException e) {
74             e.printStackTrace();
75         }
76
77     }
原文地址:https://www.cnblogs.com/vegetableDD/p/11761730.html