【代码】Excel表格数据行和列转换

前言

有个朋友需求将Excel中的数据进行行和列数据的转换,于是用Java写了个程序,通过文件流和算法进行转化

源代码

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
package io.github.feiju12138;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
* 使用说明:
* 创建一个in目录用于存储未转化的文件
* 未转化的文件格式为
* 文本文件(.txt)
* 从Excl表格中复制的数据
* 行和列数需相同,空的单元格请使用"查找并替换功能"使用特殊符号占位
* 创建一个out目录用于存放转化后的文件
* 转化后的文件格式为
* 文本文件(.txt)
* 将转化后的数据全选,粘贴在Excl表格中
*
* 案例展示:
* 转化之前:
* A1 B1 C1
* A2 B2 C2
* 转化之后:
* A1 A2
* B1 B2
* C1 C2
*/
public class Format {

// 定义文件导入路径
private static String dir = "./in/";
// 定义文件导出路径
private static String outDir = "./out/";

public static void main(String[] args) throws Exception {

File rootDir = new File(dir);
File rootOutDir = new File(outDir);

if (!rootDir.exists()) {
rootDir.mkdir();
}

if (!rootOutDir.exists()) {
rootOutDir.mkdir();
}

// 获取目录下的所有文件名
String[] filesList = rootDir.list();
// 遍历所有文件名
for (String file : filesList) {
// 创建一个集合用于存放获取的数据
List<String[]> list = new ArrayList<>();
// 字符读取流
BufferedReader in = new BufferedReader(new FileReader(dir + file));
// 缓冲字符串
String str;
while ((str = in.readLine()) != null) {
String[] rowString = str.split("\t");
list.add(rowString);
// System.out.println(str);
}

// 获取行和列的数
int row = 0;
int col = 0;

for (String[] s : list) {
if (s.length > row) {
row = s.length;
}
}
col = list.size();

// System.out.println("row:" + row);
// System.out.println("col:" + col);

// for (int i = 0; i < list.size(); i++) {
// String[] s = list.get(i);
// for (int j = 0; j < s.length; j++) {
// System.out.print(s[j]+"\t");
// }
// System.out.print("\n");
// }

// 创建旧的二维数组
String[][] arrOld = new String[col][row];
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
String[] strings = list.get(i);
arrOld[i][j] = strings[j];
}
}

// 打印旧的
// for (int i = 0; i < col; i++) {
// for (int j = 0; j < row; j++) {
// System.out.print(arrOld[i][j] + "\t");
// }
// System.out.print("\n");
// }

// 创建新的二维数组
String[][] arrNew = new String[row][col];
// for (int i = 0; i < row; i++) {
// for (int j = 0; j < col; j++) {
// System.out.print(arrNew[i][j] + "\t");
// }
// System.out.print("\n");
// }

// System.out.println();

// 为新的赋值
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
arrNew[j][i] = arrOld[i][j];
}
}

// 打印新的
// for (int i = 0; i < row; i++) {
// for (int j = 0; j < col; j++) {
// System.out.print(arrNew[i][j] + "\t");
// }
// System.out.print("\n");
// }

// 把新的封装为一个字符串
String outStr = "";
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
outStr += arrNew[i][j] + "\t";
}
outStr += "\n";
}

// 字符串转化为字符数组
char[] arrC = new char[outStr.length()];
for (int i = 0; i < outStr.length(); i++) {
char c = outStr.charAt(i);
arrC[i] = c;
}

// 字符数组转化为字节数组
Charset cs = Charset.forName("UTF-8");
CharBuffer cb = CharBuffer.allocate(arrC.length);
cb.put(arrC);
cb.flip();
ByteBuffer bb = cs.encode(cb);
byte[] buff = bb.array();

// 将字节数组输出为文件
FileOutputStream out = new FileOutputStream(outDir + file);
out.write(buff, 0, buff.length);

// 打印测试语句用于调试
System.out.println("文件<"+file+">转化完成,输出路径:"+ outDir + file);

in.close();

}


}

}

完成