package com.example.client.service; import com.example.client.dto.ColumnDto; import com.example.client.utils.*; import com.example.server.progressTrack.Dto.DiagramNodeDto; import com.example.server.progressTrack.model.DjJdgzNetworkLevel1; import com.example.server.progressTrack.model.DjJdgzNetworkLevel2List; import com.example.server.progressTrack.service.DjJdgzNetworkLevel2ListService; import com.example.server.user.model.SysUser; import com.example.server.utils.CacheUtils; import com.mxgraph.view.mxGraph; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.jdesktop.swingx.JXDatePicker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; 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.io.File; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.logging.Logger; @Service public class ImportLevel2Service { private JTable table; private JFrame frame; @Value("${data.imgDir}") private String imgPath; private File selectedFiles; @Autowired private DjJdgzNetworkLevel2ListService level2ListService; public void FileUpload(Long netWorkId, List columnDto, JTable subTable, JPanel jPanel, mxGraph graph) { frame = new JFrame("导入"); frame.setSize(900, 400); 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 = {"文件地址", "操作"};//表头 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(browseButton, new GBC(0, 0, 1, 1).setWeight(0, 1).setInsets(5)); frame.add(scrolltable, new GBC(1, 0, 3, 1).setFill(GBC.BOTH).setWeight(0, 1).setInsets(5)); frame.add(uploadButton, new GBC(0, 1, 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; } SysUser user = (SysUser) CacheUtils.get("user","user"); if (user==null){ JOptionPane.showMessageDialog(null, "用户失效请退出并重新登录", "提示", JOptionPane.WARNING_MESSAGE); return; } model.setDataVector(data, columnIdentifiers); table.setModel(model); table.getColumnModel().getColumn(0).setPreferredWidth(550); table.getColumnModel().getColumn(1).setPreferredWidth(150); 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 = level2ListService.importDiagramFromExcel(filePath, netWorkId); return flag; } @Override protected void done() { try { // 获取上传结果(在这个例子中,我们假设上传方法返回Boolean类型) String uploadSucceeded = get(); // 刷新表格数据(如果上传成功) if (uploadSucceeded.equals("true")) { waitUtil.dispose(); frame.dispose(); List list = level2ListService.getList(netWorkId); CommonTable.refreshTable(list,columnDto,subTable); level2ListService.saveDiagram(netWorkId,jPanel,graph); 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; } SysUser user = (SysUser) CacheUtils.get("user","user"); if (user==null){ flag = false; JOptionPane.showMessageDialog(null, "用户失效请退出并重新登录", "提示", 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; } }); } }