好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java树形结构数据生成导出excel文件方法记录

什么是树形结构数据

效果

用法

?

1

2

3

String jsonStr = "{\"name\":\"aaa\",\"children\":[{\"name\":\"bbb\",\"children\":[{\"name\":\"eee\"},{\"name\":\"fff\",\"children\":[{\"name\":\"iii\"},{\"name\":\"jjj\",\"children\":[{\"name\":\"qqq\"},{\"name\":\"ttt\"}]}]},{\"name\":\"www\"}]},{\"name\":\"ccc\",\"children\":[{\"name\":\"ggg\"},{\"name\":\"hhh\",\"children\":[{\"name\":\"kkk\",\"children\":[{\"name\":\"ttt\"},{\"name\":\"mmm\"}]},{\"name\":\"uuu\"}]},{\"name\":\"ooo\"}]},{\"name\":\"ddd\",\"children\":[{\"name\":\"ggg\"},{\"name\":\"hhh\",\"children\":[{\"name\":\"kkk\"},{\"name\":\"uuu\"}]}]}]}" ;

Map tree = JSONObject.parseObject(jsonStr, Map. class );

tree2Excel(tree, "E:\\" + System.currentTimeMillis() + ".xls" , "name" , "children" );

源码

?

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

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

package pers.xxx.demo.tree2excel;

 

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

 

import java.io.Closeable;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.List;

import java.util.Map;

 

/**

  * 树形结构数据导出excel工具

  * <p>

  * Created by lzy on 2021/2/24 14:09

  */

@SuppressWarnings ( "ALL" )

public class Tree2ExcelUtil {

 

     /**

      * 树形结构数据生成excel文件

      *

      * @param tree     树形数据

      * @param filePath 文件路径

      * @return

      */

     public static boolean tree2Excel(Map tree, String filePath) {

         return tree2Excel(tree, filePath, null , null );

     }

 

     /**

      * 树形结构数据生成excel文件

      *

      * @param tree         树形数据

      * @param filePath     文件路径

      * @param lableName    标签Key名称

      * @param childrenName 子节点Key名称

      * @return

      */

     public static boolean tree2Excel(Map tree, String filePath, String lableName, String childrenName) {

         if (isBlank(filePath)) {

             System.err.println( "文件名称不能为空" );

             return false ;

         }

         try {

             doSame(tree, lableName, childrenName);

             createExcel(filePath, tree);

             return true ;

         } catch (IOException e) {

             e.printStackTrace();

         }

         return false ;

     }

 

     /**

      * 树形结构数据生成Workbook对象

      *

      * @param tree    树形数据

      * @param fileSuf 文件后缀,xls/xlsx

      * @return

      */

     public static Workbook tree2Worbook(Map tree, String fileSuf) {

         return tree2Worbook(tree, fileSuf, null , null );

     }

 

     /**

      * 树形结构数据生成Workbook对象

      *

      * @param tree         树形数据

      * @param fileSuf      文件后缀,xls/xlsx

      * @param lableName    标签Key名称

      * @param childrenName 子节点Key名称

      * @return

      */

     public static Workbook tree2Worbook(Map tree, String fileSuf, String lableName, String childrenName) {

         if (isBlank(fileSuf)) {

             System.err.println( "必须指定文件后缀" );

             return null ;

         }

         try {

             doSame(tree, lableName, childrenName);

             return procesData(tree, fileSuf);

         } catch (Exception e) {

             e.printStackTrace();

         }

         return null ;

     }

 

 

     //具体实现

 

     /**

      * 标识最大列

      */

     private static int maxCol = 0 ;

     private static String lableName = "lable" ;

     private static String childrenName = "children" ;

     private static final String COL = "col" ;

     private static final String ROW = "row" ;

     private static final String ROW_OFT = "rowOft" ;

     private static final String ROW_SIZE = "rowSize" ;

 

 

     private static void doSame(Map tree, String lableName, String childrenName) {

         if (!isBlank(lableName)) {

             Tree2ExcelUtil.lableName = lableName;

         }

         if (!isBlank(childrenName)) {

             Tree2ExcelUtil.childrenName = childrenName;

         }

         coreAlgoCol(tree, 1 );

         coreAlgoRow(tree);

     }

 

     /**

      * 主要算法,计算列的坐标,计算每个节点所占行

      *

      * @param tree  数据

      * @param col   递增的列

      * @param trees 把高级别向下传递计算递增的行高

      */

     private static void coreAlgoCol(Map tree, int col, Map... trees) {

         tree.put(COL, col);

         Object childrenObj = tree.get(childrenName);

         if (childrenObj != null ) {

             List<Map> children = (List<Map>) childrenObj;

             if (children.size() > 0 ) {

                 int size = children.size() * 2 - 1 ;

                 tree.put(ROW_SIZE, size);

                 int len = trees != null ? trees.length + 1 : 1 ;

                 Map[] arrData = new Map[len];

 

                 if (trees != null && trees.length > 0 ) {

                     for ( int i = 0 ; i < trees.length; i++) {

                         Map tree1 = trees[i];

                         tree1.put(ROW_SIZE, toInt(tree1.get(ROW_SIZE), 1 ) + size - 1 );

                         arrData[i] = tree1;

                     }

                 }

                 arrData[len - 1 ] = tree;

                 for (Map tree1 : children) {

                     int newCol = col + 1 ;

                     if (newCol > maxCol) {

                         maxCol = newCol;

                     }

                     coreAlgoCol(tree1, newCol, arrData);

                 }

             }

         }

     }

 

     /**

      * 主要算法,计算行的坐标

      *

      * @param tree

      */

     private static void coreAlgoRow(Map tree) {

         if (toInt(tree.get(ROW)) == 0 ) {

             tree.put(ROW, Math.round(toInt(tree.get(ROW_SIZE), 1 ) / 2 .0f));

         }

         Object childrenObj = tree.get(childrenName);

         if (childrenObj != null ) {

             List<Map> children = (List<Map>) childrenObj;

             if (children.size() > 0 ) {

                 int tempOft = toInt(tree.get(ROW_OFT));

                 for (Map tree1 : children) {

                     int rowSize = toInt(tree1.get(ROW_SIZE), 1 );

                     tree1.put(ROW_OFT, tempOft);

                     tree1.put(ROW, tempOft + Math.round(rowSize / 2 .0f));

                     tempOft += rowSize + 1 ;

                     coreAlgoRow(tree1);

                 }

             }

         }

     }

 

     /**

      * 创建excel文件

      *

      * @param filePath 文件路径,具体路径到文件名

      * @param tree     数据

      * @throws IOException

      */

     private static void createExcel(String filePath, Map tree) throws IOException {

         File file = new File(filePath);

         boolean bfile = file.createNewFile();

         // 复制模板到新文件

         if (bfile) {

             Workbook wk = procesData(tree, filePath);

             if (wk != null ) {

                 FileOutputStream fos = null ;

                 try {

                     fos = new FileOutputStream(file);

                     wk.write(fos);

 

                     fos.flush();

                 } finally {

                     closeStream(fos);

                     wk.close();

                 }

             }

         }

     }

 

 

     /**

      * 处理excel数据

      *

      * @param tree 数据

      * @return 工作表对象

      */

     private static Workbook procesData(Map tree, String fileName) {

 

         Workbook wk = null ;

         if (fileName.endsWith( "xls" )) {

             wk = new HSSFWorkbook();

         }

         if (fileName.endsWith( "xlsx" )) {

             wk = new XSSFWorkbook();

         }

         if (wk == null ) {

             System.err.println( "文件名称不正确" );

             return null ;

         }

 

         //创建一个sheet页

         Sheet sheet = wk.createSheet( "Sheet1" );

 

         int colSize = maxCol * 2 + 2 ;

         int rowSize = toInt(tree.get(ROW_SIZE), 1 );

         for ( int i = 0 ; i <= rowSize; i++) {

             Row row = sheet.createRow(i);

             for ( int j = 0 ; j <= colSize; j++) {

                 row.createCell(j);

             }

         }

         //配置单元格背景色

         CellStyle style1 = wk.createCellStyle();

         style1.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());

         style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);

         CellStyle style2 = wk.createCellStyle();

         style2.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());

         style2.setFillPattern(FillPatternType.SOLID_FOREGROUND);

 

         dealCell(sheet, tree, style1, style2);

 

         return wk;

     }

 

     /**

      * 根据计算好的坐标填充每一个单元格

      *

      * @param sheet  #

      * @param tree   数据

      * @param style1 单元格格式

      * @param style2 单元格格式

      */

     private static void dealCell(Sheet sheet, Map tree, CellStyle style1, CellStyle style2) {

         Row row = sheet.getRow(toInt(tree.get(ROW)));

         int oftCol = (toInt(tree.get(COL)) - 1 ) * 2 + 1 ;

         Cell cell = row.getCell(oftCol);

         cell.setCellStyle(style1);

         cell.setCellValue(String.valueOf(tree.get(lableName)));

 

         sheet.setColumnWidth(oftCol, 256 * 20 );

 

         Object childrenObj = tree.get(childrenName);

         if (childrenObj != null ) {

             List<Map> children = (List<Map>) childrenObj;

             if (children.size() > 0 ) {

                 int size = children.size();

 

                 int startRow = toInt(children.get( 0 ).get(ROW));

                 int endRow = toInt(children.get(size - 1 ).get(ROW));

                 int col = oftCol + 1 ;

                 sheet.setColumnWidth(col, 256 );

                 for (; startRow <= endRow; startRow++) {

                     sheet.getRow(startRow).getCell(col).setCellStyle(style2);

                 }

 

                 for (Map child : children) {

                     dealCell(sheet, child, style1, style2);

                 }

             }

         }

     }

 

     private static int toInt(Object val) {

         return toInt(val, 0 );

     }

 

     private static int toInt(Object val, Integer defVal) {

         try {

             return Integer.parseInt(String.valueOf(val));

         } catch (NumberFormatException ignored) {

         }

         return defVal;

     }

 

     private static boolean isBlank(String str) {

         return str == null || str.trim().length() == 0 ;

     }

 

     /**

      * 关闭流

      *

      * @param closeables 不定长数组 流对象

      */

     public static void closeStream(Closeable... closeables) {

         for (Closeable closeable : closeables) {

             if (closeable != null ) {

                 try {

                     closeable.close();

                 } catch (IOException e) {

                     e.printStackTrace();

                 }

             }

         }

     }

 

}

总结

到此这篇关于Java树形结构数据生成导出excel文件的文章就介绍到这了,更多相关Java树形结构数据生成导出excel内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/LZY_1993/article/details/114083456

查看更多关于Java树形结构数据生成导出excel文件方法记录的详细内容...

  阅读:16次