本文展示了如何在 Java 中以编程方式将 MS Excel XLS 或 XLSX 转换为 Google 表格。

在 Java 中将 Excel XLS 或 XLSX 转换为 Google 表格

Google 表格 是一种流行的在线应用程序,可让您创建和操作电子表格文档。此外,它还允许您与多人实时共享电子表格。因此,您通常必须以编程方式将数据从 Excel 工作簿导出到 Google 表格中的电子表格。在本文中,我们将完整介绍如何将 Excel 数据导出到 Java 中的 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。

  • Aspose.Cells for Java - 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,如上一节所述。

  3. 复制 JSON 文件(我们在 Google Cloud 中创建凭据后下载的文件)并将其粘贴到项目目录中。

  4. 指定定义工作表访问权限的应用程序范围。此外,为令牌目录路径和 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 方法,并在此方法中初始化表格服务。
// 构建新的授权 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 Sheets 上创建一个新的电子表格。
// 使用默认工作表创建新的 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);
	}
  
  // TO-DO:执行将数据发布到 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");
	}
}

演示 - Java 中的 Excel 到 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 的更多信息。如果您有任何问题或疑问,请通过我们的 论坛 告诉我们。

也可以看看