本文介紹如何在 Java 中以編程方式將 MS Excel XLS 或 XLSX 轉換為 Google 表格。
Google 表格 是一種流行的在線應用程序,可讓您創建和操作電子表格文檔。此外,它還允許您與多人實時共享電子表格。因此,您通常必須以編程方式將數據從 Excel 工作簿導出到 Google 表格中的電子表格。在本文中,我們將完整介紹如何使用 Java 將 Excel 數據導出到 Google 表格。
先決條件 - 使用 Java 將 Excel 數據導出到 Google 表格
谷歌云項目
Google Cloud 是一個雲計算平台,它提供了我們可以在我們的應用程序中使用的各種類型的服務。要使用 Google Sheets API,我們必須在 Google Cloud 控制台上創建一個項目並啟用 Google Sheets API。您可以閱讀有關如何創建 Google Cloud 項目和啟用 Sheets API 的分步指南。
將 Excel 數據導出到 Google 表格的 Java API
要將數據從 Excel XLS/XLSX 文件導出到 Google 表格,我們需要以下 API。
- 用於 Java 的 Aspose.Cells - To read the data from Excel files.
- 適用於 Java 的 Google 客戶端 API - 在 Google 表格上創建和更新電子表格。
要安裝這些 API,您可以在 pom.xml 文件中使用以下配置。
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>http://repository.aspose.com/repo/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-gson</artifactId>
<version>1.33.0</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-sheets</artifactId>
<version>v4-rev20210629-1.32.1</version>
</dependency>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-cells</artifactId>
<version>22.2</version>
</dependency>
</dependencies>
用 Java 將 Excel 數據導出到 Google 表格
以下是讀取 Excel 文件然後將其數據導出到 Java 控制台應用程序中的 Google 表格的步驟。
- 創建一個新的 Java 應用程序(桌面)。
2.在項目中安裝Aspose.Cells for Java和Google Client APIs,如上一節所述。
複製 JSON 文件(我們在 Google Cloud 中創建憑據後下載的文件)並將其粘貼到項目目錄中。
指定定義工作表訪問權限的應用程序範圍。此外,為令牌目錄路徑和 JSON 工廠創建變量。
/**
* 所需範圍的全局實例。如果修改這些範圍,刪除
* 您之前保存的令牌/文件夾。
*/
private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
- 創建一個 getCredentials 方法,使用憑證文件授權用戶。
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// 加載客戶端機密
InputStream in = new FileInputStream(new File("credentials.json"));
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// 構建流程並觸髮用戶授權請求
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
- 創建createSpreadsheet 方法在Google Sheets 上創建一個新的電子表格並設置默認工作表的名稱。此方法返回一個電子表格對象。
private static Spreadsheet createSpreadsheet(Sheets _service, String spreadsheetName, String _defaultSheetName)
throws IOException {
// 創建一個新的電子表格
Spreadsheet spreadsheet = new Spreadsheet()
.setProperties(new SpreadsheetProperties().setTitle(spreadsheetName));
// 創建新工作表
Sheet sheet = new Sheet();
sheet.setProperties(new SheetProperties());
sheet.getProperties().setTitle(_defaultSheetName);
// 將工作表添加到列表
List<Sheet> sheetList = new ArrayList<Sheet>();
sheetList.add(sheet);
spreadsheet.setSheets(sheetList);
// 執行請求
spreadsheet = _service.spreadsheets().create(spreadsheet).setFields("spreadsheetId").execute();
System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());
return spreadsheet;
}
- 創建一個 addSheet 方法以在 Google 電子表格中添加一個新工作表。
private static void addSheet(Sheets _service, String _spreadSheetID, String _sheetName) {
try {
// 添加新工作表
AddSheetRequest addSheetRequest = new AddSheetRequest();
addSheetRequest.setProperties(new SheetProperties());
addSheetRequest.getProperties().setTitle(_sheetName);
// 創建更新請求
BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
Request req = new Request();
req.setAddSheet(addSheetRequest);
batchUpdateSpreadsheetRequest.setRequests(new ArrayList<Request>());
batchUpdateSpreadsheetRequest.getRequests().add(req);
// 執行請求
_service.spreadsheets().batchUpdate(_spreadSheetID, batchUpdateSpreadsheetRequest).execute();
} catch (Exception e) {
System.out.println("Error in creating sheet: " + e.getMessage());
}
}
- 現在,創建 exportExcelToGoogle 方法,並在該方法中初始化 Sheets 服務。
// 構建新的授權 API 客戶端服務。
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME).build();
- 然後,使用 Aspose.Cells for Java 加載 Excel XLS/XLSX 文件。此外,獲取工作簿中第一個工作表的名稱。
// 加載 Excel 工作簿
Workbook wb = new Workbook(_excelFileName);
// 獲取第一個工作表的名稱
String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();
// 獲取所有工作表
WorksheetCollection collection = wb.getWorksheets();
- 調用 createSpreadsheet 方法在 Google 表格上創建一個新的電子表格。
// 使用默認工作表創建新的 Google 電子表格
Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
- 從每個工作表中讀取數據並將其保存到列表中。
String range;
// 遍歷工作表
for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
// 獲取工作表的參考
Worksheet ws = collection.get(worksheetIndex);
if (worksheetIndex == 0) {
// 默認情況下創建第一個工作表,因此只設置範圍
range = defaultWorksheetName + "!A:Y";
} else {
// 添加新工作表
addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
range = ws.getName().trim() + "!A:Y";
}
// 獲取行數和列數
int rows = ws.getCells().getMaxDataRow();
int cols = ws.getCells().getMaxDataColumn();
List<List<Object>> worksheetData = new ArrayList<List<Object>>();
// 遍歷行
for (int i = 0; i <= rows; i++) {
List<Object> rowData = new ArrayList<Object>();
// 遍歷所選行中的每一列
for (int j = 0; j <= cols; j++) {
if (ws.getCells().get(i, j).getValue() == null)
rowData.add("");
else
rowData.add(ws.getCells().get(i, j).getValue());
}
// 添加到工作表數據
worksheetData.add(rowData);
}
// 待辦事項:執行將數據發佈到 Google 表格的請求
}
- 對於 Excel 文件中的每個工作表,創建一個請求以將數據寫入 Google 表格中的電子表格。
// 設定範圍
ValueRange body = new ValueRange();
body.setRange(range);
// 設定值
body.setValues(worksheetData);
// 將值導出到 Google 表格
UpdateValuesResponse result = service.spreadsheets().values()
.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
.execute();
// 打印輸出
System.out.printf("%d cells updated.", result.getUpdatedCells());
下面給出了從 Excel 文件讀取數據並將其導出到 Google 表格電子表格的完整方法。
private static void exportExcelToGoogle(String _excelFileName) {
try {
// 構建新的授權 API 客戶端服務。
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME).build();
// 加載 Excel 工作簿
Workbook wb = new Workbook(_excelFileName);
// 獲取第一個工作表的名稱
String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();
// 獲取所有工作表
WorksheetCollection collection = wb.getWorksheets();
// 使用默認工作表創建新的 Google 電子表格
Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
System.out.println("Spreadsheet URL: " + spreadsheet.getSpreadsheetUrl());
System.out.println("ID: " + spreadsheet.getSpreadsheetId());
String range;
// 遍歷工作表
for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
// 獲取工作表的參考
Worksheet ws = collection.get(worksheetIndex);
if (worksheetIndex == 0) {
// 默認情況下創建第一個工作表,因此只設置範圍
range = defaultWorksheetName + "!A:Y";
} else {
// 添加新工作表
addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
range = ws.getName().trim() + "!A:Y";
}
// 獲取行數和列數
int rows = ws.getCells().getMaxDataRow();
int cols = ws.getCells().getMaxDataColumn();
List<List<Object>> worksheetData = new ArrayList<List<Object>>();
// 遍歷行
for (int i = 0; i <= rows; i++) {
List<Object> rowData = new ArrayList<Object>();
// 遍歷所選行中的每一列
for (int j = 0; j <= cols; j++) {
if (ws.getCells().get(i, j).getValue() == null)
rowData.add("");
else
rowData.add(ws.getCells().get(i, j).getValue());
}
// 添加到工作表數據
worksheetData.add(rowData);
}
// 設定範圍
ValueRange body = new ValueRange();
body.setRange(range);
// 設定值
body.setValues(worksheetData);
// 將值導出到 Google 表格
UpdateValuesResponse result = service.spreadsheets().values()
.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
.execute();
// 打印輸出
System.out.printf("%d cells updated.", result.getUpdatedCells());
}
// 在瀏覽器中打開 Google 電子表格
Desktop desk = Desktop.getDesktop();
desk.browse(new URI("https://docs.google.com/spreadsheets/d/" + spreadsheet.getSpreadsheetId()));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
完整的源代碼
以下是將 Excel XLSX 文件轉換為 Java 中的 Google 表格的完整源代碼。
package excel_to_google_sheets;
import com.aspose.cells.Workbook;
import com.aspose.cells.Worksheet;
import com.aspose.cells.WorksheetCollection;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.AddSheetRequest;
import com.google.api.services.sheets.v4.model.BatchUpdateSpreadsheetRequest;
import com.google.api.services.sheets.v4.model.Request;
import com.google.api.services.sheets.v4.model.Sheet;
import com.google.api.services.sheets.v4.model.SheetProperties;
import com.google.api.services.sheets.v4.model.Spreadsheet;
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ExportExcelToGoogle {
/**
* 所需範圍的全局實例。如果修改這些範圍,刪除
* 您之前保存的令牌/文件夾。
*/
private static final String APPLICATION_NAME = "Google Sheets API Java Quickstart";
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
public static void main(String[] args) throws Exception {
// 將 Excel 數據導出到 Google 表格
exportExcelToGoogle("workbook.xlsx");
}
private static void exportExcelToGoogle(String _excelFileName) {
try {
// 構建新的授權 API 客戶端服務。
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME).build();
// 加載 Excel 工作簿
Workbook wb = new Workbook(_excelFileName);
// 獲取第一個工作表的名稱
String defaultWorksheetName = wb.getWorksheets().get(0).getName().trim();
// 獲取所有工作表
WorksheetCollection collection = wb.getWorksheets();
// 使用默認工作表創建新的 Google 電子表格
Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
String range;
// 遍歷工作表
for (int worksheetIndex = 0; worksheetIndex < collection.getCount(); worksheetIndex++) {
// 獲取工作表的參考
Worksheet ws = collection.get(worksheetIndex);
if (worksheetIndex == 0) {
// 默認情況下創建第一個工作表,因此只設置範圍
range = defaultWorksheetName + "!A:Y";
} else {
// 添加新工作表
addSheet(service, spreadsheet.getSpreadsheetId(), ws.getName().trim());
range = ws.getName().trim() + "!A:Y";
}
// 獲取行數和列數
int rows = ws.getCells().getMaxDataRow();
int cols = ws.getCells().getMaxDataColumn();
List<List<Object>> worksheetData = new ArrayList<List<Object>>();
// 遍歷行
for (int i = 0; i <= rows; i++) {
List<Object> rowData = new ArrayList<Object>();
// 遍歷所選行中的每一列
for (int j = 0; j <= cols; j++) {
if (ws.getCells().get(i, j).getValue() == null)
rowData.add("");
else
rowData.add(ws.getCells().get(i, j).getValue());
}
// 添加到工作表數據
worksheetData.add(rowData);
}
// 設定範圍
ValueRange body = new ValueRange();
body.setRange(range);
// 設定值
body.setValues(worksheetData);
// 將值導出到 Google 表格
UpdateValuesResponse result = service.spreadsheets().values()
.update(spreadsheet.getSpreadsheetId(), range, body).setValueInputOption("USER_ENTERED")
.execute();
// 打印輸出
System.out.printf("%d cells updated.", result.getUpdatedCells());
}
// 在瀏覽器中打開 Google 電子表格
Desktop desk = Desktop.getDesktop();
desk.browse(new URI("https://docs.google.com/spreadsheets/d/" + spreadsheet.getSpreadsheetId()));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static Spreadsheet createSpreadsheet(Sheets _service, String spreadsheetName, String _defaultSheetName)
throws IOException {
// 創建一個新的電子表格
Spreadsheet spreadsheet = new Spreadsheet()
.setProperties(new SpreadsheetProperties().setTitle(spreadsheetName));
// 創建新工作表
Sheet sheet = new Sheet();
sheet.setProperties(new SheetProperties());
sheet.getProperties().setTitle(_defaultSheetName);
// 將工作表添加到列表
List<Sheet> sheetList = new ArrayList<Sheet>();
sheetList.add(sheet);
spreadsheet.setSheets(sheetList);
// 執行請求
spreadsheet = _service.spreadsheets().create(spreadsheet).setFields("spreadsheetId").execute();
System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());
return spreadsheet;
}
private static void addSheet(Sheets _service, String _spreadSheetID, String _sheetName) {
try {
// 添加新工作表
AddSheetRequest addSheetRequest = new AddSheetRequest();
addSheetRequest.setProperties(new SheetProperties());
addSheetRequest.getProperties().setTitle(_sheetName);
// 創建更新請求
BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
Request req = new Request();
req.setAddSheet(addSheetRequest);
batchUpdateSpreadsheetRequest.setRequests(new ArrayList<Request>());
batchUpdateSpreadsheetRequest.getRequests().add(req);
// 執行請求
_service.spreadsheets().batchUpdate(_spreadSheetID, batchUpdateSpreadsheetRequest).execute();
} catch (Exception e) {
System.out.println("Error in creating sheet: " + e.getMessage());
}
}
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// 加載客戶端機密
InputStream in = new FileInputStream(new File("credentials.json"));
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// 構建流程並觸髮用戶授權請求
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline").build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
}
演示 - Excel 到 Java 中的 Google 表格轉換
Java Excel 到 Google Sheets API - 獲得免費許可證
您可以獲得免費的臨時許可,並在沒有評估限制的情況下使用 Aspose.Cells for Java。
結論
在本文中,您了解瞭如何使用 Java 以編程方式將 Excel XLS 或 XLSX 文件導出到 Google 表格。我們提供了有關如何創建 Google Cloud 項目、啟用 Google Sheets API、讀取 Excel 文件以及將數據從 Excel 文件導出到 Google Sheets 的完整指南。您還可以訪問 文檔 以閱讀有關 Aspose.Cells for Java 的更多信息。如果您有任何問題或疑問,請通過我們的 論壇 告訴我們。