如何使用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
相关产品推荐
相关产品推荐

