如何使用Java提取SYLK文件指定数据并按坐标写入新XLS文件
SYLK数据提取生成XLS实现方案
依赖配置
使用Apache POI操作XLS文件,Maven项目引入如下依赖:
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> </dependencies>
核心代码实现
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import java.io.*; import java.util.LinkedList; import java.util.Queue; public class SylkToXlsConverter { public static void main(String[] args) { // 配置文件路径 String sylkFilePath = "替换为你的SYLK文件本地路径.slk"; String outputXlsPath = "替换为输出XLS文件的本地路径.xls"; // 滑动窗口缓存最近2行非目标行,顺序为[目标行前2行, 目标行前1行] Queue<String> recentLines = new LinkedList<>(); Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("提取数据"); try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sylkFilePath), "GBK"))) { String line; while ((line = br.readLine()) != null) { line = line.trim(); // 匹配C;开头的目标数据行 if (line.startsWith("C;")) { // 跳过前置坐标行缺失的异常数据 if (recentLines.size() < 2) { continue; } // 提取X、Y坐标数值 String xLine = (String) recentLines.toArray()[0]; String yLine = (String) recentLines.toArray()[1]; int x = Integer.parseInt(xLine.replaceAll("[^0-9]", "")); int y = Integer.parseInt(yLine.replaceAll("[^0-9]", "")); // 提取目标单元格值,可根据实际SYLK格式调整提取规则 String cellValue = line.substring(2).trim(); // POI行、列默认0基,若你的坐标是1基无需调整,是0基删除-1即可 Row row = sheet.getRow(x - 1); if (row == null) { row = sheet.createRow(x - 1); } Cell cell = row.createCell(y - 1); cell.setCellValue(cellValue); } else { // 非目标行加入滑动窗口,最多保留2行 recentLines.offer(line); if (recentLines.size() > 2) { recentLines.poll(); } } } // 写入输出文件 try (FileOutputStream fos = new FileOutputStream(outputXlsPath)) { workbook.write(fos); } workbook.close(); System.out.println("数据提取完成"); } catch (Exception e) { e.printStackTrace(); } } }
适配调整说明
- 若SYLK文件编码不是GBK,修改
InputStreamReader的编码参数即可 - 若C;行有特殊格式(比如
C;Kxxx带前缀的结构),调整cellValue的提取逻辑适配即可 - 若X对应列、Y对应行,交换
createRow和createCell的参数即可
内容的提问来源于stack exchange,提问作者codeitforfuture
相关产品推荐
相关产品推荐

