本文介紹如何在 Java 中以編程方式將 MS Excel XLS 或 XLSX 轉換為 Google 表格。

在 Java 中將 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 表格的步驟。

  1. 創建一個新的 Java 應用程序(桌面)。

2.在項目中安裝Aspose.Cells for Java和Google Client APIs,如上一節所述。

  1. 複製 JSON 文件(我們在 Google Cloud 中創建憑據後下載的文件)並將其粘貼到項目目錄中。

  2. 指定定義工作表訪問權限的應用程序範圍。此外,為令牌目錄路徑和 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);
  1. 創建一個 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");
}
  1. 創建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;
}
  1. 創建一個 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());
	}
}
  1. 現在,創建 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();
  1. 然後,使用 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();
  1. 調用 createSpreadsheet 方法在 Google 表格上創建一個新的電子表格。
// 使用默認工作表創建新的 Google 電子表格
Spreadsheet spreadsheet = createSpreadsheet(service, wb.getFileName(), defaultWorksheetName);
  1. 從每個工作表中讀取數據並將其保存到列表中。
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 表格的請求 
}
  1. 對於 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 的更多信息。如果您有任何問題或疑問,請通過我們的 論壇 告訴我們。

也可以看看