Skip to content

Commit e3cfa9d

Browse files
committed
添加csv拆分功能。
1 parent 25819c6 commit e3cfa9d

5 files changed

Lines changed: 135 additions & 43 deletions

File tree

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@
216216
<version>4.1.0</version>
217217
</dependency>
218218

219+
<!-- commons-csv csv解析工具类 -->
220+
<dependency>
221+
<groupId>org.apache.commons</groupId>
222+
<artifactId>commons-csv</artifactId>
223+
<version>1.6</version>
224+
</dependency>
225+
219226
<!-- 目录文件监控工具包 -->
220227
<!-- <dependency> <groupId>net.sf.jpathwatch</groupId> <artifactId>jpathwatch</artifactId>
221228
<version>0.95</version> </dependency> -->

src/main/java/com/xwintop/xJavaFxTool/controller/littleTools/ExcelSplitToolController.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
@Slf4j
2121
public class ExcelSplitToolController extends ExcelSplitToolView {
2222
private ExcelSplitToolService excelSplitToolService = new ExcelSplitToolService(this);
23+
private String[] fileTypeChoiceBoxStrings = new String[]{"Excel", "CSV", "文件"};
2324

2425
@Override
2526
public void initialize(URL location, ResourceBundle resources) {
@@ -29,13 +30,15 @@ public void initialize(URL location, ResourceBundle resources) {
2930
}
3031

3132
private void initView() {
33+
fileTypeChoiceBox.getItems().addAll(fileTypeChoiceBoxStrings);
34+
fileTypeChoiceBox.getSelectionModel().select(0);
3235
JavaFxViewUtil.setSpinnerValueFactory(sheetSelectSpinner, 0, Integer.MAX_VALUE, 0);
3336
JavaFxViewUtil.setSpinnerValueFactory(splitType1Spinner, 1, Integer.MAX_VALUE, 3);
3437
JavaFxViewUtil.setSpinnerValueFactory(splitType2Spinner, 1, Integer.MAX_VALUE, 10);
3538
}
3639

3740
private void initEvent() {
38-
selectFileTextField.setText("C:\\Users\\5FDSJ068\\Desktop\\test/test.xlsx");
41+
selectFileTextField.setText("C:\\Users\\Administrator\\Desktop\\file.csv");
3942
FileChooserUtil.setOnDrag(selectFileTextField, FileChooserUtil.FileType.FILE);
4043
FileChooserUtil.setOnDrag(saveFilePathTextField, FileChooserUtil.FileType.FOLDER);
4144
}

src/main/java/com/xwintop/xJavaFxTool/services/littleTools/ExcelSplitToolService.java

Lines changed: 119 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
import lombok.Getter;
55
import lombok.Setter;
66
import lombok.extern.slf4j.Slf4j;
7+
import org.apache.commons.collections.IteratorUtils;
8+
import org.apache.commons.csv.CSVFormat;
9+
import org.apache.commons.csv.CSVParser;
10+
import org.apache.commons.csv.CSVPrinter;
11+
import org.apache.commons.csv.CSVRecord;
712
import org.apache.commons.lang3.StringUtils;
813
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
914
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@@ -13,10 +18,7 @@
1318
import org.apache.poi.ss.usermodel.Workbook;
1419
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
1520

16-
import java.io.File;
17-
import java.io.FileInputStream;
18-
import java.io.FileOutputStream;
19-
import java.io.IOException;
21+
import java.io.*;
2022
import java.nio.file.Paths;
2123
import java.util.*;
2224

@@ -31,6 +33,17 @@ public ExcelSplitToolService(ExcelSplitToolController excelSplitToolController)
3133
}
3234

3335
public void splitAction() throws Exception { //拆分表格
36+
int fileTypeSelectIndex = excelSplitToolController.getFileTypeChoiceBox().getSelectionModel().getSelectedIndex();
37+
if (fileTypeSelectIndex == 0) {
38+
splitExcel();
39+
} else if (fileTypeSelectIndex == 1) {
40+
splitCsv();
41+
} else if (fileTypeSelectIndex == 2) {
42+
splitFile();
43+
}
44+
}
45+
46+
public void splitExcel() throws Exception { //拆分Excel表格
3447
String filePath = excelSplitToolController.getSelectFileTextField().getText();
3548
FileInputStream fileInputStream = new FileInputStream(filePath);
3649

@@ -67,40 +80,39 @@ public void splitAction() throws Exception { //拆分表格
6780
}
6881
saveSplitWorkbook(sheet, newFilePath, splitCellIndex);
6982
}
83+
}
84+
85+
public void splitCsv() throws Exception {
86+
String filePath = excelSplitToolController.getSelectFileTextField().getText();
87+
Reader fileReader = new FileReader(filePath);
88+
String newFilePath = StringUtils.appendIfMissing(filePath, "", ".csv", ".CSV");
89+
if (StringUtils.isNotEmpty(excelSplitToolController.getSaveFilePathTextField().getText())) {
90+
newFilePath = StringUtils.appendIfMissing(excelSplitToolController.getSaveFilePathTextField().getText(), "/", "/", "\\") + Paths.get(newFilePath).getFileName();
91+
}
92+
CSVParser parser = CSVFormat.DEFAULT.parse(fileReader);
93+
int splitNumber = 0;
94+
if (excelSplitToolController.getSplitType1RadioButton().isSelected()) {
95+
List<CSVRecord> csvRecordList = parser.getRecords();
96+
splitNumber = csvRecordList.size() / (excelSplitToolController.getSplitType1Spinner().getValue() - 1);
97+
saveSplitCsv(csvRecordList.iterator(), splitNumber, newFilePath);
98+
} else if (excelSplitToolController.getSplitType2RadioButton().isSelected()) {
99+
splitNumber = excelSplitToolController.getSplitType2Spinner().getValue();
100+
saveSplitCsv(parser.iterator(), splitNumber, newFilePath);
101+
} else if (excelSplitToolController.getSplitType3RadioButton().isSelected()) {
102+
String splitType3String = excelSplitToolController.getSplitType3TextField().getText();
103+
String[] splitCellIndex = null;
104+
if (StringUtils.isEmpty(splitType3String)) {
105+
splitCellIndex = new String[]{"0"};
106+
} else {
107+
splitCellIndex = splitType3String.split(",");
108+
}
109+
saveSplitCsv(parser.iterator(), newFilePath, splitCellIndex);
110+
}
111+
fileReader.close();
112+
}
113+
114+
public void splitFile() {
70115

71-
// for (int i = 0; i <= lastRowIndex; i++) {
72-
// Row row = sheet.getRow(i);
73-
// if (row == null) {
74-
// break;
75-
// }
76-
// short lastCellNum = row.getLastCellNum();// 列数
77-
// for (int j = 0; j < lastCellNum; j++) {
78-
// Cell cell = row.getCell(j);
79-
// String str = null;
80-
// switch (cell.getCellType()) {
81-
// case BLANK:// 空值
82-
// str = "";
83-
// break;
84-
// case BOOLEAN:
85-
// str = String.valueOf(cell.getBooleanCellValue());// 布尔型
86-
// break;
87-
// case FORMULA:
88-
// str = String.valueOf(cell.getCellFormula());// 公式型
89-
// break;
90-
// case NUMERIC:
91-
// str = String.valueOf(cell.getNumericCellValue());// 数值型
92-
// break;
93-
// case STRING:
94-
// str = String.valueOf(cell.getStringCellValue());// 字符型
95-
// break;
96-
// default:
97-
// str = null;
98-
// break;
99-
// }
100-
// System.out.print(str + "\t\t");
101-
// }
102-
// System.out.println();
103-
// }
104116
}
105117

106118
private void saveSplitWorkbook(Sheet sheet, int splitNumber, String newFilePath) throws Exception {
@@ -189,7 +201,73 @@ private void saveSplitWorkbook(Sheet sheet, String newFilePath, String[] splitCe
189201

190202
}
191203

192-
public static void saveFile(Workbook workbook, String filePath) {
204+
private void saveSplitCsv(Iterator<CSVRecord> iterator, int splitNumber, String newFilePath) throws Exception {
205+
int addRowIndex = 0;
206+
int saveFileIndex = 0;
207+
boolean isAddHead = excelSplitToolController.getIncludeHandCheckBox().isSelected();
208+
CSVPrinter printer = null;
209+
CSVRecord firstRecord = null;
210+
while (iterator.hasNext()) {
211+
CSVRecord record = iterator.next();
212+
if (isAddHead && addRowIndex == 0 && saveFileIndex == 0) {
213+
firstRecord = record;
214+
}
215+
if (printer == null) {
216+
printer = CSVFormat.DEFAULT.print(new PrintWriter(newFilePath + "-" + (saveFileIndex++) + ".csv"));
217+
if (isAddHead && saveFileIndex != 0) {
218+
printer.printRecord(IteratorUtils.toList(record.iterator()).toArray());
219+
}
220+
}
221+
printer.printRecord(IteratorUtils.toList(record.iterator()).toArray());
222+
if ((addRowIndex++ - splitNumber) == (isAddHead ? 1 : 0)) {
223+
printer.flush();
224+
printer.close();
225+
printer = null;
226+
addRowIndex = 0;
227+
}
228+
}
229+
if (printer != null) {
230+
printer.flush();
231+
printer.close();
232+
}
233+
}
234+
235+
private void saveSplitCsv(Iterator<CSVRecord> iterator, String newFilePath, String[] splitCellIndex) throws Exception {
236+
CSVRecord firstRecord = null;
237+
Map<String, List<CSVRecord>> rowMap = new HashMap<>();
238+
while (iterator.hasNext()) {
239+
CSVRecord record = iterator.next();
240+
if (firstRecord == null) {
241+
firstRecord = record;
242+
}
243+
String rowString = "";
244+
for (String cellIndex : splitCellIndex) {
245+
rowString += record.get(Integer.valueOf(cellIndex));
246+
}
247+
if (rowMap.containsKey(rowString)) {
248+
rowMap.get(rowString).add(record);
249+
} else {
250+
List<CSVRecord> rowList = new ArrayList<>();
251+
rowList.add(record);
252+
rowMap.put(rowString, rowList);
253+
}
254+
}
255+
for (Map.Entry<String, List<CSVRecord>> stringListEntry : rowMap.entrySet()) {
256+
String key = stringListEntry.getKey();
257+
List<CSVRecord> rows = stringListEntry.getValue();
258+
CSVPrinter printer = CSVFormat.DEFAULT.print(new PrintWriter(newFilePath + "-" + key + ".csv"));
259+
if (excelSplitToolController.getIncludeHandCheckBox().isSelected()) {
260+
printer.printRecord(IteratorUtils.toList(firstRecord.iterator()).toArray());
261+
}
262+
for (CSVRecord row : rows) {
263+
printer.printRecord(IteratorUtils.toList(row.iterator()).toArray());
264+
}
265+
printer.flush();
266+
printer.close();
267+
}
268+
}
269+
270+
private static void saveFile(Workbook workbook, String filePath) {
193271
if (workbook instanceof HSSFWorkbook) {
194272
filePath = StringUtils.appendIfMissing(filePath, ".xls", ".xls", ".xlsx");
195273
} else if (workbook instanceof XSSFWorkbook) {
@@ -212,7 +290,7 @@ public static void saveFile(Workbook workbook, String filePath) {
212290
}
213291
}
214292

215-
public static void copyRow(Row row, Row newRow) {
293+
private static void copyRow(Row row, Row newRow) {
216294
try {
217295
newRow.setHeight(row.getHeight());
218296
newRow.setHeightInPoints(row.getHeightInPoints());
@@ -226,7 +304,7 @@ public static void copyRow(Row row, Row newRow) {
226304
});
227305
}
228306

229-
public static void setCellValue(Cell cell, Cell newCell) {
307+
private static void setCellValue(Cell cell, Cell newCell) {
230308
try {
231309
newCell.setCellStyle(cell.getCellStyle());
232310
} catch (Exception e) {
@@ -254,7 +332,7 @@ public static void setCellValue(Cell cell, Cell newCell) {
254332
}
255333
}
256334

257-
public static String getCellValue(Cell cell) {
335+
private static String getCellValue(Cell cell) {
258336
String str = null;
259337
switch (cell.getCellType()) {
260338
case BLANK:// 空值

src/main/java/com/xwintop/xJavaFxTool/view/littleTools/ExcelSplitToolView.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public abstract class ExcelSplitToolView implements Initializable {
1414
@FXML
1515
protected Spinner<Integer> sheetSelectSpinner;
1616
@FXML
17+
protected ChoiceBox<String> fileTypeChoiceBox;
18+
@FXML
1719
protected Button selectFileButton;
1820
@FXML
1921
protected CheckBox includeHandCheckBox;

src/main/resources/com/xwintop/xJavaFxTool/fxmlView/littleTools/ExcelSplitTool.fxml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
<?import javafx.scene.control.Button?>
44
<?import javafx.scene.control.CheckBox?>
5+
<?import javafx.scene.control.ChoiceBox?>
56
<?import javafx.scene.control.Label?>
67
<?import javafx.scene.control.RadioButton?>
78
<?import javafx.scene.control.Spinner?>
@@ -16,7 +17,7 @@
1617
<TextField fx:id="selectFileTextField" layoutX="99.0" layoutY="20.0" />
1718
<Button fx:id="selectFileButton" layoutX="256.0" layoutY="20.0" mnemonicParsing="false" onAction="#selectFileAction" text="选择" />
1819
<Label layoutX="31.0" layoutY="82.0" text="文件分隔方式:" />
19-
<CheckBox fx:id="includeHandCheckBox" layoutX="31.0" layoutY="107.0" mnemonicParsing="false" text="Excel包含标题行" />
20+
<CheckBox fx:id="includeHandCheckBox" layoutX="31.0" layoutY="107.0" mnemonicParsing="false" selected="true" text="Excel包含标题行" />
2021
<RadioButton fx:id="splitType1RadioButton" layoutX="33.0" layoutY="132.0" mnemonicParsing="false" selected="true" text="按平均分成">
2122
<toggleGroup>
2223
<ToggleGroup fx:id="splitTypeToggleGroup" />
@@ -46,5 +47,6 @@
4647
<Button fx:id="saveFilePathButton" layoutX="253.0" layoutY="248.0" mnemonicParsing="false" onAction="#saveFilePathAction" text="选择" />
4748
<Label layoutX="31.0" layoutY="51.0" text="Sheet选择:" />
4849
<Spinner fx:id="sheetSelectSpinner" layoutX="100.0" layoutY="47.0" prefHeight="23.0" prefWidth="81.0" />
50+
<ChoiceBox fx:id="fileTypeChoiceBox" layoutX="321.0" layoutY="20.0" />
4951
</children>
5052
</AnchorPane>

0 commit comments

Comments
 (0)