保存文件类型改为csv文件
This commit is contained in:
@@ -453,38 +453,57 @@ public class ImageDotMarker extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JFileChooser fileChooser = new JFileChooser();
|
JFileChooser fileChooser = new JFileChooser();
|
||||||
fileChooser.setSelectedFile(new File("mark_points.txt"));
|
|
||||||
fileChooser.setFileFilter(new FileNameExtensionFilter("文本文件 (*.txt)", "txt"));
|
// 设置默认文件名,使用当前图片文件名作为基础
|
||||||
|
String defaultFilename = "mark_points.csv";
|
||||||
|
if (currentImagePath != null) {
|
||||||
|
File imageFile = new File(currentImagePath);
|
||||||
|
String imageName = imageFile.getName();
|
||||||
|
// 移除图片扩展名
|
||||||
|
int lastDotIndex = imageName.lastIndexOf('.');
|
||||||
|
if (lastDotIndex > 0) {
|
||||||
|
imageName = imageName.substring(0, lastDotIndex);
|
||||||
|
}
|
||||||
|
defaultFilename = imageName + "_mark_points.csv";
|
||||||
|
}
|
||||||
|
|
||||||
|
fileChooser.setSelectedFile(new File(defaultFilename));
|
||||||
|
fileChooser.setFileFilter(new FileNameExtensionFilter("CSV文件 (*.csv)", "csv"));
|
||||||
|
|
||||||
int result = fileChooser.showSaveDialog(this);
|
int result = fileChooser.showSaveDialog(this);
|
||||||
if (result == JFileChooser.APPROVE_OPTION) {
|
if (result == JFileChooser.APPROVE_OPTION) {
|
||||||
try {
|
try {
|
||||||
File file = fileChooser.getSelectedFile();
|
File file = fileChooser.getSelectedFile();
|
||||||
if (!file.getName().toLowerCase().endsWith(".txt")) {
|
if (!file.getName().toLowerCase().endsWith(".csv")) {
|
||||||
file = new File(file.getAbsolutePath() + ".txt");
|
file = new File(file.getAbsolutePath() + ".csv");
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
// 添加头部信息
|
// CSV列标题
|
||||||
sb.append("# 图片标记点坐标导出\n");
|
|
||||||
if (currentImagePath != null) {
|
|
||||||
sb.append(String.format("# 来源图片: %s\n", new File(currentImagePath).getName()));
|
|
||||||
}
|
|
||||||
sb.append(String.format("# 导出时间: %s\n", new java.util.Date()));
|
|
||||||
sb.append("# ======================================\n\n");
|
|
||||||
|
|
||||||
// 添加标记点数据
|
|
||||||
sb.append("序号,名称,X坐标,Y坐标\n");
|
sb.append("序号,名称,X坐标,Y坐标\n");
|
||||||
|
|
||||||
|
// 添加标记点数据,确保CSV格式正确处理包含逗号或引号的名称
|
||||||
for (int i = 0; i < points.size(); i++) {
|
for (int i = 0; i < points.size(); i++) {
|
||||||
MarkPoint p = points.get(i);
|
MarkPoint p = points.get(i);
|
||||||
sb.append(String.format("%d,%s,%d,%d\n", i + 1, p.name, p.x, p.y));
|
String quotedName = p.name;
|
||||||
|
// CSV格式要求:如果字段包含逗号、双引号或换行符,需要用双引号包围,且内部的双引号用两个双引号表示
|
||||||
|
if (quotedName.contains(",") || quotedName.contains("\"") || quotedName.contains("\n")) {
|
||||||
|
quotedName = "\"" + quotedName.replace("\"", "\"\"") + "\"";
|
||||||
|
}
|
||||||
|
sb.append(String.format("%d,%s,%d,%d\n", i + 1, quotedName, p.x, p.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入文件
|
// 写入文件,使用UTF-8编码并添加BOM以支持Excel正确识别中文
|
||||||
java.nio.file.Files.write(file.toPath(), sb.toString().getBytes("UTF-8"));
|
try (java.io.FileOutputStream fos = new java.io.FileOutputStream(file)) {
|
||||||
|
// 写入UTF-8 BOM
|
||||||
|
byte[] bom = {(byte)0xEF, (byte)0xBB, (byte)0xBF}; // UTF-8 BOM
|
||||||
|
fos.write(bom);
|
||||||
|
// 写入CSV内容
|
||||||
|
fos.write(sb.toString().getBytes("UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
JOptionPane.showMessageDialog(this, "标记点坐标导出成功!\n保存位置: " + file.getAbsolutePath());
|
JOptionPane.showMessageDialog(this, "标记点坐标导出成功!\n保存位置: " + file.getAbsolutePath());
|
||||||
updateStatusBar("已导出标记点坐标到文件");
|
updateStatusBar("已导出标记点坐标到CSV文件");
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
JOptionPane.showMessageDialog(this, "导出失败: " + ex.getMessage());
|
JOptionPane.showMessageDialog(this, "导出失败: " + ex.getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user