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

如何使用Java编写SOQL查询Salesforce对象并将结果导出为CSV

Java调用Salesforce SOQL查询并导出CSV实现方案

1. 依赖引入

首先在项目中引入两个核心依赖,以下是Maven配置示例:

<!-- Salesforce Web Service Connector -->
<dependency>
    <groupId>com.force.api</groupId>
    <artifactId>force-wsc</artifactId>
    <version>59.0.0</version>
</dependency>
<!-- Salesforce Partner API -->
<dependency>
    <groupId>com.force.api</groupId>
    <artifactId>force-partner-api</artifactId>
    <version>59.0.0</version>
</dependency>
<!-- CSV导出工具 -->
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>

如果是Gradle项目自行转换对应依赖格式即可。

2. 建立Salesforce连接

使用Partner API建立与Salesforce实例的连接:

import com.sforce.soap.partner.Connector;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

public class SalesforceConnector {
    public static PartnerConnection getConnection() throws ConnectionException {
        ConnectorConfig config = new ConnectorConfig();
        // 替换为你的Salesforce登录用户名
        config.setUsername("your-salesforce-username@example.com");
        // 密码规则:你的登录密码+账户安全令牌
        config.setPassword("your-password" + "your-security-token");
        // 如果是沙箱环境,设置endpoint为https://test.salesforce.com/services/Soap/u/59.0
        config.setAuthEndpoint("https://login.salesforce.com/services/Soap/u/59.0");
        return Connector.newConnection(config);
    }
}

3. 执行SOQL查询并获取全量结果

Salesforce单次查询最多返回2000条数据,需要处理分页逻辑拉取全量数据:

import com.sforce.soap.partner.PartnerConnection;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.sobject.SObject;
import java.util.ArrayList;
import java.util.List;

public class SoqlQueryExecutor {
    public static List<SObject> queryAll(PartnerConnection connection, String soql) throws ConnectionException {
        List<SObject> allRecords = new ArrayList<>();
        QueryResult queryResult = connection.query(soql);
        boolean done = false;
        while (!done) {
            SObject[] records = queryResult.getRecords();
            if (records != null) {
                for (SObject record : records) {
                    allRecords.add(record);
                }
            }
            if (queryResult.isDone()) {
                done = true;
            } else {
                queryResult = connection.queryMore(queryResult.getQueryLocator());
            }
        }
        return allRecords;
    }
}

4. 导出查询结果为CSV

解析查询结果的表头和行数据,写入CSV文件:

import com.opencsv.CSVWriter;
import com.sforce.soap.partner.sobject.SObject;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class CsvExporter {
    // headers参数为你SOQL中指定的查询字段列表,顺序要和SOQL一致
    public static void exportToCsv(List<SObject> records, String[] headers, String outputPath) throws Exception {
        // 写入UTF-8 BOM头,解决Excel打开中文乱码问题
        FileOutputStream fos = new FileOutputStream(outputPath);
        fos.write(0xef);
        fos.write(0xbb);
        fos.write(0xbf);
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        CSVWriter writer = new CSVWriter(osw);
        
        // 写入表头
        writer.writeNext(headers);
        
        // 写入行数据
        for (SObject record : records) {
            String[] row = new String[headers.length];
            for (int i = 0; i < headers.length; i++) {
                Object fieldValue = record.getField(headers[i]);
                row[i] = fieldValue == null ? "" : fieldValue.toString();
            }
            writer.writeNext(row);
        }
        
        writer.close();
        osw.close();
        fos.close();
    }
}

5. 主方法调用示例

public class Main {
    public static void main(String[] args) {
        try {
            // 1. 建立连接
            PartnerConnection connection = SalesforceConnector.getConnection();
            // 2. 定义SOQL,必须明确指定查询字段,不能用*
            String soql = "SELECT Id, Name, Industry, BillingCity, CreatedDate FROM Account LIMIT 1000";
            // 3. 定义表头,顺序和SOQL查询字段一致
            String[] headers = {"Id", "Name", "Industry", "BillingCity", "CreatedDate"};
            // 4. 执行查询
            List<SObject> records = SoqlQueryExecutor.queryAll(connection, soql);
            // 5. 导出CSV
            CsvExporter.exportToCsv(records, headers, "/your/output/path/account_export.csv");
            System.out.println("导出成功,共导出" + records.size() + "条数据");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  • 密码拼接的安全令牌可以在Salesforce账户设置的「我的个人信息」-「重置我的安全令牌」处获取
  • 如果SOQL包含跨对象关联字段(比如Owner.Name),需要在导出时增加嵌套取值逻辑:如果getField("Owner")返回的是SObject对象,再调用getField("Name")取对应值
  • Salesforce API有调用频率限制,不要短时间内发起大量查询请求
  • 数据量极大的场景建议使用Salesforce Bulk API替代SOAP API,性能更好

内容的提问来源于stack exchange,提问作者Basith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:18:04