package com.example.client.service; import com.example.client.dto.ColumnDto; import com.example.client.dto.JComboBoxItem; import com.example.client.utils.*; import com.example.server.cabin.service.CabinService; import com.example.server.progressTrack.model.DjJdgzNetworkLevel3; import com.example.server.progressTrack.service.*; import com.example.server.teamGroup.service.SysTeamGroupClassService; import com.example.server.utils.DownLoadTmpFile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.util.Date; import java.util.List; @Service public class ImportLevel3Service { private JTable table; private JFrame frame; @Value("${data.imgDir}") private String imgPath; private File selectedFiles; @Autowired private Level3ManageService level3ManageService; @Autowired private DjJdgzNetworkLevel3Service level3Service; @Autowired private DjJdgzNetworkLevel2ListService level2ListService; @Autowired private DjJdgzNetworkLevel2Service level2Service; @Autowired private SysTeamGroupClassService sysTeamGroupClassService; @Autowired private CabinService cabinService; @Autowired private DjJdgzNetworkLevel1Service level1Service; @Value("${data.tmp-path}") private String tmpPath; public void FileUpload(List columnDto, JTable subTable, JFrame jFrame) { frame = new JFrame("导入"); frame.setSize(900, 600); frame.setResizable(true); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setVisible(true); GridBagLayout layout = new GridBagLayout(); frame.setLayout(layout); table = new JTable(); table.setRowHeight(40); DefaultTableModel model = new DefaultTableModel(); String[] columnIdentifiers = {"文件地址", "操作"};//表头 final Long[] level1Id = {null}; final Long[] level2Id = {null}; final Long[] level2NodeId = {null}; JComboBoxItem[] projectList = level1Service.getProjectList(); JComboBoxItem[] level2List = level2Service.getLevel2List(projectList[0].getId()); JComboBoxItem[] level2NodeList = level2ListService.getNode(level2List[0].getId()); level1Id[0] = projectList[0].getId(); level2Id[0] = level2List[0].getId(); level2NodeId[0] = level2NodeList[0].getId(); JLabel label0 = new JLabel("工程"); JComboBox comboBox0 = new JComboBox<>(projectList); JLabel label1 = new JLabel("二级网络图"); JComboBox comboBox1 = new JComboBox<>(); comboBox1.setModel(new DefaultComboBoxModel<>(level2List)); JLabel label2 = new JLabel("二级网络图节点"); JComboBox comboBox2 = new JComboBox<>(level2NodeList); comboBox2.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); setText(truncateText(value.toString(), 15)); // 截断文本 return this; } private String truncateText(String text, int maxLength) { if (text.length() > maxLength) { return text.substring(0, maxLength - 3) + "..."; } return text; } }); JButton downloadbtn = new JButton("三级网络图模板下载"); comboBox0.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBoxItem selectedItem = (JComboBoxItem) comboBox0.getSelectedItem(); if (selectedItem != null) { long selectedId = selectedItem.getId(); level1Id[0] = selectedId; JComboBoxItem[] level2List = level2Service.getLevel2List(selectedId); comboBox1.setModel(new DefaultComboBoxModel<>(level2List)); comboBox2.setModel(new DefaultComboBoxModel<>()); } } } }); comboBox1.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem(); if (selectedItem != null) { long selectedId = selectedItem.getId(); level2Id[0] = selectedId; JComboBoxItem[] level2NodeList = level2ListService.getNode(selectedId); comboBox2.setModel(new DefaultComboBoxModel<>(level2NodeList)); } } } }); comboBox2.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBoxItem selectedItem = (JComboBoxItem) comboBox2.getSelectedItem(); if (selectedItem != null) { long selectedId = selectedItem.getId(); level2NodeId[0] = selectedId; } } } }); downloadbtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DownLoadTmpFile.down(tmpPath + "三级网络图导入模板.xlsx", frame); } }); JScrollPane scrolltable = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrolltable.setViewportView(table); scrolltable.getViewport().setBackground(Color.WHITE); JButton browseButton = new JButton("选择文件"); JButton uploadButton = new JButton("上传文件"); frame.add(label0, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame.add(comboBox0, new GBC(1, 0, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5)); frame.add(label1, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame.add(comboBox1, new GBC(1, 1, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5)); frame.add(label2, new GBC(0, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5)); frame.add(comboBox2, new GBC(1, 2, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5)); frame.add(downloadbtn, new GBC(0, 3, 2, 1).setFill(GBC.BOTH).setInsets(5)); frame.add(browseButton, new GBC(0, 4, 1, 1).setWeight(0, 1).setInsets(5)); frame.add(scrolltable, new GBC(1, 4, 3, 1).setFill(GBC.BOTH).setWeight(0, 1).setInsets(5)); frame.add(uploadButton, new GBC(0, 5, 4, 1).setWeight(1, 0)); browseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Boolean flag = true; // 保存当前的外观设置 LookAndFeel savedLookAndFeel = UIManager.getLookAndFeel(); // 设置文件选择器外观 try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { ex.printStackTrace(); } JFileChooser fileChooser = new JFileChooser(); fileChooser.setDialogTitle("选择文件"); fileChooser.setPreferredSize(new Dimension(800, 500)); fileChooser.setMultiSelectionEnabled(true); //恢复外观,避免改变所有组件外观 try { UIManager.setLookAndFeel(savedLookAndFeel); } catch (UnsupportedLookAndFeelException ed) { ed.printStackTrace(); } int result = fileChooser.showOpenDialog(frame); if (result == JFileChooser.FILES_ONLY) { selectedFiles = fileChooser.getSelectedFile(); Integer oldNum = model.getRowCount(); String[][] data = new String[oldNum + 1][2]; for (int i = 0; i < oldNum; i++) { data[i][0] = model.getValueAt(i, 0).toString(); } String suffix = selectedFiles.getName().substring(selectedFiles.getName().lastIndexOf(".")); if (suffix.equals(".xlsx") || suffix.equals(".xls")) { data[oldNum][0] = selectedFiles.getPath(); } else { flag = false; } if (!flag) { JOptionPane.showMessageDialog(null, "只能上传.xlsx或.xls的文件,且不超过2G", "提示", JOptionPane.WARNING_MESSAGE); return; } model.setDataVector(data, columnIdentifiers); table.setModel(model); table.getColumnModel().getColumn(0).setPreferredWidth(600); table.getColumnModel().getColumn(1).setPreferredWidth(100); table.getColumnModel().getColumn(0).setCellRenderer(new TableViewRenderer()); table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRendererButton()); table.getColumnModel().getColumn(1).setCellEditor(new TableCellEditorButton(null, null)); } else { Object[] options = {"OK ", "CANCEL "}; JOptionPane.showOptionDialog(null, "选择的文件不正确 ", "提示", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); } } }); uploadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 创建旋转等待框的实例(假设WaitUtil是一个自定义的Swing组件) final WaitUtil waitUtil = new WaitUtil(imgPath, "文件正在导入,请稍候"); // 开始上传文件的异步任务 SwingWorker sw = new SwingWorker() { @Override protected String doInBackground() throws Exception { // 上传文件的逻辑 StringBuilder result = new StringBuilder(); // 从第一列(索引为0)获取数据 String data = model.getValueAt(0, 0).toString(); // 将数据和换行符拼接到StringBuilder中 result.append(data); String filePath = result.toString(); String flag = level3Service.importDiagramFromExcel(filePath, level1Id[0], level2Id[0], level2NodeId[0]); return flag; } @Override protected void done() { try { // 获取上传结果(在这个例子中,我们假设上传方法返回Boolean类型) String uploadSucceeded = get(); // 刷新表格数据(如果上传成功) if (uploadSucceeded.equals("true")) { waitUtil.dispose(); frame.dispose(); JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList(); JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null); JComboBoxItem[] cabinList = cabinService.getList(); String[] typeList = new String[]{ "改装", "加装", "换装", "改进性修理" }; List list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null); CommonTable.refreshTable(list, columnDto, subTable); level3ManageService.tableModelListener(list, subTable, jFrame); System.out.println("导入成功时间" + new Date()); } else { waitUtil.dispose(); JOptionPane.showMessageDialog(null, uploadSucceeded, "提示", JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) { ex.printStackTrace(); waitUtil.dispose(); } } }; // 执行异步任务 sw.execute(); waitUtil.setVisible(true); } }); scrolltable.setTransferHandler(new TransferHandler() { private static final long serialVersionUID = 1L; @Override public boolean importData(JComponent comp, Transferable t) { try { Boolean flag = true; Object o = t.getTransferData(DataFlavor.javaFileListFlavor); String filepath = o.toString(); if (filepath.startsWith("[")) { filepath = filepath.substring(1); } if (filepath.endsWith("]")) { filepath = filepath.substring(0, filepath.length() - 1); } String[] filepathArr = filepath.split(", "); Integer oldNum = model.getRowCount(); String[][] data = new String[oldNum + filepathArr.length][2]; for (int i = 0; i < oldNum; i++) { data[i][0] = model.getValueAt(i, 0).toString(); } for (int i = 0; i < filepathArr.length; i++) { if (filepathArr[i].contains(".xlsx") || filepathArr[i].contains(".xls")) { data[i + oldNum][0] = filepathArr[i]; } else { flag = false; break; } } if (!flag) { JOptionPane.showMessageDialog(null, "只能上传.xlsx或.xls的文件,且不超过2G\"", "提示", JOptionPane.WARNING_MESSAGE); return flag; } model.setDataVector(data, columnIdentifiers); table.setModel(model); table.getColumnModel().getColumn(0).setPreferredWidth(650); table.getColumnModel().getColumn(1).setPreferredWidth(80); table.getColumnModel().getColumn(0).setCellRenderer(new TableViewRenderer()); table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRendererButton()); table.getColumnModel().getColumn(1).setCellEditor(new TableCellEditorButton(null, null)); return true; } catch (Exception e) { e.printStackTrace(); } return false; } @Override public boolean canImport(JComponent comp, DataFlavor[] flavors) { for (int i = 0; i < flavors.length; i++) { if (DataFlavor.javaFileListFlavor.equals(flavors[i])) { return true; } } return false; } }); } }