You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:27:00