Tìm Kiếm, Sửa Chữa, Xác Thực: Hướng Dẫn Toàn Diện về API Tìm Kiếm, Thay Thế & Liên Kết Hỏng của Aspose.Cells Cloud (.NET / Python / Java / cURL)
“Trong số 400 sổ ngân sách của chúng tôi, cái nào vẫn hiển thị Old Vendor Ltd?” “Thay thế mọi chỗ giữ chỗ
{{COMPANY}}trong mẫu này.” “Có báo cáo nào của chúng tôi vẫn liên kết tới miền mà chúng tôi đã ngừng sử dụng năm ngoái không?” — ba câu hỏi rất khác nhau, một câu trả lời chung: một cuộc gọi REST đọc và ghi lại các bảng tính trong đám mây, mà không cần cài đặt Excel ở bất kỳ đâu.
Các vấn đề nội dung bảng tính xuất hiện trong hầu hết các codebase nặng dữ liệu:
- Kiểm tra nội dung — tìm mọi ô, hình dạng hoặc siêu liên kết đề cập đến tên sản phẩm đã ngừng sử dụng, địa chỉ văn phòng cũ, hoặc thực thể pháp lý lỗi thời;
- Kết xuất mẫu — điền các token
{{PLACEHOLDER}}trên các trang tính trước khi gửi sổ làm việc cho khách hàng; - Liên kết chết — kiểm tra các URL nhúng trong sổ làm việc vẫn hoạt động, trước khi công việc tuân thủ hoặc lưu trữ phê duyệt;
- Sửa chữa hàng loạt — sửa lỗi chính tả hoặc giá trị cột sai chính tả trên hàng chục trang tính, hoặc chỉ trong một khu vực của một trang tính.
Các tùy chọn truyền thống — một thư viện kịch bản chạy trên máy của bạn, một macro Excel, hoặc một thành phần COM trên máy chủ Windows — đều có nghĩa là bạn phải tự lưu trữ và mở rộng logic bảng tính. Aspose.Cells Cloud biến chúng thành REST đơn giản: gửi một tệp (hoặc chỉ tên tệp), nhận các kết quả khớp — hoặc một tệp đã được sửa — trở lại.
Bài viết này hướng dẫn các API được cung cấp bởi SearchController cốt lõi trong microservice Aspose.Cells Cloud (nguồn: src/Aspose.Cells.Cloud.MicroService/Controllers/SearchController.cs), kèm theo các ví dụ có thể chạy được bằng cURL và C# (.NET), cùng với các ghi chú cho người dùng Python và Java.
1. SearchController có thể làm gì?
SearchController bao gồm ba họ khả năng, mỗi một có sẵn ở một số phạm vi:
| Nhóm | Chức năng | Có thay đổi workbook? |
|---|---|---|
| Search | Trả về các mục văn bản khớp với truy vấn — kèm theo vị trí sheet và ô/hình/hyperlink của chúng | Không |
| Replace | Thay thế văn bản khớp, sau đó hoặc truyền lại tệp đã chỉnh sửa hoặc lưu nó vào lưu trữ đám mây | Có |
| Broken links | Xác thực mọi liên kết http(s) trong workbook và trả về những liên kết không thể giải quyết |
Không |
Và mỗi họ được phơi bày ở bốn phạm vi, đó là nơi danh sách các endpoint trở nên dài:
| Phạm vi | Tìm kiếm | Thay thế | Liên kết hỏng |
|---|---|---|---|
| Tệp cục bộ → xử lý trực tuyến (tải lên trong phần thân yêu cầu) | PUT /v4.0/cells/search/content |
PUT /v4.0/cells/replace/content |
PUT /v4.0/cells/search/broken-links |
| Toàn bộ workbook trong lưu trữ đám mây | PUT /v4.0/cells/{name}/search/content |
PUT /v4.0/cells/{name}/replace/content |
PUT /v4.0/cells/{name}/search/broken-links |
| Worksheet đơn trong lưu trữ đám mây | PUT /v4.0/cells/{name}/worksheets/{worksheet}/search/content |
PUT /v4.0/cells/{name}/worksheets/{worksheet}/replace/content |
PUT /v4.0/cells/{name}/worksheets/{worksheet}/search/broken-links |
| Range đơn trong lưu trữ đám mây | PUT /v4.0/cells/{name}/worksheets/{worksheet}/ranges/{cellArea}/search/content |
PUT /v4.0/cells/{name}/worksheets/{worksheet}/ranges/{cellArea}/replace/content |
PUT /v4.0/cells/{name}/worksheets/{worksheet}/ranges/{cellArea}/search/broken-links |
Thêm hai endpoint bổ sung mà xuất mọi mục văn bản trong một workbook — xem §4:
| Mục tiêu | Điểm cuối |
|---|---|
| Tất cả các mục văn bản trong tệp đám mây | PUT /v4.0/cells/{name}/search/content/all-textitems |
| Tất cả các mục văn bản trong tải lên cục bộ | PUT /v4.0/cells/search/content/all-textitems |
Lưu ý triển khai: các tuyến được tiền tố bằng
v{version:apiVersion}/cellsvà bộ điều khiển này có[ApiVersion("4.0")], vì vậy các cuộc gọi thực tế trông giống nhưhttps://api.aspose.cloud/v4.0/cells/.... Mọi thứ trong bộ điều khiển này đều làPUT— ngay cả các tìm kiếm chỉ đọc — vì một tìm kiếm được mô hình hoá như một hoạt động được gửi tới một tài nguyên, không phải làGETcó thể lưu vào bộ nhớ cache.
Hai chế độ hoạt động và lý do chúng quan trọng
Controller trang trí mỗi hành động, và decorator cho bạn biết chính xác tệp đến từ đâu:
[OnlineOperation]— không trạng thái. Bạn tải lên workbook trong phần thân yêu cầu (multipart), máy chủ xử lý nó trong bộ nhớ, và không có gì được lưu vào lưu trữ đám mây. Hoàn hảo cho “chỉ cho tôi biết nội dung trong tệp này” và cho việc tạo mẫu một lần.[CloudFileOperation]— dựa trên lưu trữ. Máy chủ lấy{name}từ lưu trữ đám mây (tùy chọn dướifolder=), thực hiện công việc, và — đối với các thao tác thay thế — ghi kết quả trở lại ngay. Không có gì được truyền về máy của bạn.
Sự khác biệt duy nhất đó, cùng với các đoạn đường dẫn {worksheet} / {cellArea}, là toàn bộ mô hình tư duy. Phần còn lại của bài viết này chỉ là các chi tiết.
2. Các mô hình phản hồi mà bạn sẽ thực sự phân tích
Cả hai họ tìm kiếm đều trả về một hình dạng nhỏ, phẳng, dễ gắn kết. Tìm kiếm trả về SearchResponse:
{
"Code": 200,
"Status": "OK",
"TextItems": [
{
"Filename": "Book1.xlsx",
"Worksheet": "Q3 Forecast",
"Position": "Cell:B7",
"Content": "Old Vendor Ltd"
},
{
"Filename": "Book1.xlsx",
"Worksheet": "Q3 Forecast",
"Position": "Shape:TextBox 3",
"Content": "Prepared by Old Vendor Ltd"
}
]
}
Tìm kiếm liên kết hỏng trả về BrokenLinksResponse:
{
"Code": 200,
"Status": "OK",
"BrokenLinks": [
{
"Filename": "Book1.xlsx",
"Worksheet": "Links",
"Position": "Hyperlink:Sheet1!B4",
"LinkAddress": "https://retired-domain.example.com/report"
}
]
}
Hai điều đáng chú ý ngay lập tức:
Positionlà một vị trí được gắn thẻ, không chỉ là địa chỉ ô. Nó có tiền tốCell:,Hyperlink:hoặcShape:, đó là cách một danh sách phẳng duy nhất có thể cho bạn biết loại đối tượng nào đã khớp. Thẻ đó là sự khác biệt giữa “fix cell B7” và “fix the text box sitting over B7”.- Cả hai mô hình đều tự mô tả cho việc báo cáo —
FilenamevàWorksheetđược trả về trên mỗi mục, vì vậy một lần quét qua nhiều workbook có thể được nối lại thành một bảng kiểm toán mà không cần xử lý hậu kỳ.
3. Hai điều bạn cần trước khi bắt đầu
-
Đăng ký một tài khoản miễn phí trên Aspose Cloud Dashboard và tạo một Ứng dụng để nhận
Client IDvàClient Secret(các SDK sẽ tự động đổi chúng lấy JWT — không cần tự xây dựng header xác thực). -
Cài đặt SDK cho ngôn ngữ bạn chọn:
<!-- .NET -->
<PackageReference Include="Aspose.Cells-Cloud" Version="25.x" />
# Python
pip install asposecellscloud
<!-- Java (Maven) — note: NOT on Maven Central, so the Aspose repo below is required -->
<repositories>
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.cloud/repo/</url>
</repository>
</repositories>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-cells-cloud</artifactId>
<version>26.8</version>
</dependency>
Không cần SDK? Mọi thứ đều là REST thuần, vì vậy cURL cũng hoạt động tốt như vậy (xem bên dưới). Bộ công cụ tìm kiếm/thay thế/liên kết hỏng cũng có thể truy cập thông qua các mô hình yêu cầu SDK đã được định kiểu —
SearchSpreadsheetContentRequest,ReplaceContentInRemoteRangeRequest, và các hàm liên quan — đây là những gì các đoạn mã C# bên dưới sử dụng.
4. Kịch bản A: Tìm kiếm một tệp cục bộ trực tuyến (không lưu trữ)
Đây là PUT /v4.0/cells/search/content — tải lên workbook, nhận lại các kết quả khớp. Không có lưu trữ đám mây, không cần dọn dẹp, không để lại bản sao.
① cURL
# 1) First, get a token
curl -X POST "https://api.aspose.cloud/connect/token" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET"
# 2) Find "Old Vendor Ltd" anywhere in a local workbook
curl -X PUT "https://api.aspose.cloud/v4.0/cells/search/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "ignoringCase=true" \
-F "file=@Book1.xlsx"
Hạn chế nó trong một trang tính, hoặc trong một vùng của một trang tính, bằng hai tham số truy vấn bổ sung:
# Only "Q3 Forecast", only the range A1:F40
curl -X PUT "https://api.aspose.cloud/v4.0/cells/search/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "worksheet=Q3 Forecast" \
--data-urlencode "cellArea=A1:F40" \
-F "file=@Book1.xlsx"
② C# / .NET
using Aspose.Cells.Cloud.SDK.Api;
using Aspose.Cells.Cloud.SDK.Request;
var cellsApi = new CellsApi("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET");
// Local file, whole workbook
var request = new SearchSpreadsheetContentRequest(
spreadsheet: "C:/audit/Book1.xlsx", // local file path
searchText: "Old Vendor Ltd",
ignoringCase: true);
SearchResponse response = cellsApi.SearchSpreadsheetContent(request);
foreach (var item in response.TextItems)
{
Console.WriteLine($"{item.Worksheet} | {item.Position} | {item.Content}");
}
// Same call, scoped to one sheet and one range
var scoped = new SearchSpreadsheetContentRequest(
spreadsheet: "C:/audit/Book1.xlsx",
searchText: "Old Vendor Ltd",
ignoringCase: true,
sheetname: "Q3 Forecast",
cellarea: "A1:F40");
Các mô hình yêu cầu cũng cung cấp
password(mở một workbook được bảo vệ) vàregoin(cài đặt khu vực/địa phương) — cùng các tham số tùy chọn mà bạn sẽ thấy trên các biến thể cloud‑storage dưới dạngstorageName. Lưu ý SDK .NET giữ nguyên cách viếtregoin; SDK Python gọi cùng hai cài đặt này làpasswordvàregion.
③ Python / Java
Python SDK bao bọc cùng họ endpoint, với các trường của mô hình yêu cầu được ánh xạ tới các trường của C# một‑một nhưng theo snake_case:
from asposecellscloud.apis.cells_api import CellsApi
from asposecellscloud.requests import (
SearchSpreadsheetContentRequest,
SearchContentInRemoteRangeRequest,
)
instance = CellsApi("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET")
# Local upload — returned items carry Worksheet / Position / Content
local = instance.search_spreadsheet_content(
SearchSpreadsheetContentRequest(
"Book1.xlsx", "Old Vendor Ltd",
ignoring_case=True, worksheet="Q3 Forecast", cell_area="A1:F40"))
# Range-scoped search of a file already in cloud storage
remote = instance.search_content_in_remote_range(
SearchContentInRemoteRangeRequest(
"Book1.xlsx", "Q3 Forecast", "A1:F40", "Old Vendor Ltd",
ignoring_case=True, folder="Reports"))
for item in remote.text_items:
print(item.worksheet, item.position, item.content)
Java SDK tuân theo cùng một cấu trúc với các đối tượng Request được xây dựng thông qua các setter:
import com.aspose.cloud.cells.api.CellsApi;
import com.aspose.cloud.cells.model.SearchResponse;
import com.aspose.cloud.cells.request.SearchContentInRemoteRangeRequest;
public class SearchDemo {
public static void main(String[] args) throws Exception {
CellsApi api = new CellsApi("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET");
SearchContentInRemoteRangeRequest req = new SearchContentInRemoteRangeRequest();
req.setName("Book1.xlsx");
req.setWorksheet("Q3 Forecast");
req.setCellArea("A1:F40");
req.setSearchText("Old Vendor Ltd");
req.setIgnoringCase(true);
req.setFolder("Reports");
SearchResponse response = api.searchContentInRemoteRange(req);
response.getTextItems().forEach(i ->
System.out.println(i.getWorksheet() + " | " + i.getPosition() + " | " + i.getContent()));
}
}
Nếu bạn đang sử dụng REST thô, lệnh cURL ở trên là hợp đồng đầy đủ — trường multipart chỉ cần mang tên tệp, vì dịch vụ sẽ suy ra tên workbook (và do đó định dạng của nó) từ tệp đó.
5. Kịch bản B: Tìm kiếm tệp đã tồn tại trong lưu trữ đám mây
Khi sổ làm việc đã có sẵn trong Aspose Cloud Storage, hãy bỏ qua việc tải xuống hoàn toàn — dịch vụ sẽ đọc nó ngay tại nơi nó đang lưu trữ:
# Whole workbook
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/search/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "ignoringCase=true" \
--data-urlencode "folder=Reports"
# Just one worksheet
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/worksheets/Q3%20Forecast/search/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd"
# Just one range of one worksheet
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/worksheets/Q3%20Forecast/ranges/A1:F40/search/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd"
// Whole workbook in storage
var response = cellsApi.SearchContentInRemoteSpreadsheet(
new SearchContentInRemoteSpreadsheetRequest(
name: "Book1.xlsx",
searchText: "Old Vendor Ltd",
ignoringCase: true,
folder: "Reports"));
// One worksheet
var sheetHits = cellsApi.SearchContentInRemoteWorksheet(
new SearchContentInRemoteWorksheetRequest(
name: "Book1.xlsx",
sheetname: "Q3 Forecast",
searchText: "Old Vendor Ltd",
folder: "Reports"));
// One range
var rangeHits = cellsApi.SearchContentInRemoteRange(
new SearchContentInRemoteRangeRequest(
name: "Book1.xlsx",
sheetname: "Q3 Forecast",
cellArea: "A1:F40",
searchText: "Old Vendor Ltd",
ignoringCase: true,
folder: "Reports"));
Tại sao có ba endpoint thay vì một? Vì tuyến đường mang theo phạm vi. Endpoint toàn bộ workbook nhận một tên và một truy vấn; endpoint worksheet nhận một đoạn worksheet; endpoint range nhận một worksheet và một đoạn range. Đây là một cấu trúc REST sạch sẽ, có thể cache — và nó có nghĩa là các tham số “narrow my search” (
worksheet,cellArea) chỉ tồn tại only trên endpoint local-file, điều này đáng nhớ khi bạn chuyển một lời gọi từ một phạm vi sang phạm vi khác.
6. Kịch bản C: Lấy mọi mục văn bản trong một workbook
Đôi khi bạn không có một cụm từ tìm kiếm — bạn muốn danh sách toàn bộ. Các endpoint all-textitems trả về mọi mục văn bản trong workbook, vì vậy bạn có thể so sánh hai phiên bản, xây dựng một bảng thuật ngữ dịch thuật, hoặc cung cấp cho một bộ chỉ mục:
# Cloud file — every text item
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/search/content/all-textitems" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "folder=Reports"
# Local upload — every text item
curl -X PUT "https://api.aspose.cloud/v4.0/cells/search/content/all-textitems" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@Book1.xlsx"
Phản hồi là cùng một phong bì SearchResponse, với Content được điền cho mọi chuỗi ô, chú thích siêu liên kết và văn bản hình dạng trong tệp. Đây là primitive “grep the whole workbook”.
7. Kịch bản D: Thay thế — và hai kết quả rất khác nhau
Replace là nơi API chia thành hai phần, và sự chia tách này là có chủ ý:
| Tải lên cục bộ → tải xuống tệp đã sửa | Tệp đám mây → được lưu lại vào lưu trữ | |
|---|---|---|
| Endpoint | PUT /v4.0/cells/replace/content |
PUT /v4.0/cells/{name}/replace/content |
| Returns | Một file stream (cùng định dạng bạn đã tải lên) | CellsCloudResponse { "Code": 200, "Status": "OK" } |
| Storage touched | None | Tệp gốc được ghi đè |
① Thay thế trong một workbook cục bộ, truyền kết quả trở lại
curl -X PUT "https://api.aspose.cloud/v4.0/cells/replace/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText={{COMPANY}}" \
--data-urlencode "replaceText=Northwind Traders" \
-F "file=@template.xlsx" \
-o template-rendered.xlsx
using Aspose.Cells.Cloud.SDK.Request;
var request = new ReplaceSpreadsheetContentRequest(
spreadsheet: "C:/templates/template.xlsx",
searchText: "{{COMPANY}}",
replaceText: "Northwind Traders");
// Option A: get the corrected workbook as a Stream
using Stream corrected = cellsApi.ReplaceSpreadsheetContent(request);
using var outFile = File.Create("C:/templates/template-rendered.xlsx");
corrected.CopyTo(outFile);
// Option B: let the SDK write it for you (.NET overload with an output path)
// cellsApi.ReplaceSpreadsheetContent(request, "C:/templates/template-rendered.xlsx");
Ở đây cũng có sẵn hai tham số phạm vi — sheetname và cellarea — để bạn có thể hiển thị các placeholder trong một sheet mà không ảnh hưởng đến phần còn lại của mẫu.
② Thay thế trong một workbook đám mây, lưu lại tại chỗ
# Whole workbook, saved back to storage
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/replace/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "replaceText=Northwind Traders" \
--data-urlencode "folder=Reports"
# One worksheet
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/worksheets/Q3%20Forecast/replace/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "replaceText=Northwind Traders" \
--data-urlencode "folder=Reports"
# One range
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/worksheets/Q3%20Forecast/ranges/A1:F40/replace/content" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "searchText=Old Vendor Ltd" \
--data-urlencode "replaceText=Northwind Traders" \
--data-urlencode "folder=Reports"
// Whole workbook — result saved back into cloud storage
cellsApi.ReplaceContentInRemoteSpreadsheet(
new ReplaceContentInRemoteSpreadsheetRequest(
name: "Book1.xlsx",
searchText: "Old Vendor Ltd",
replaceText: "Northwind Traders",
folder: "Reports"));
// Range-scoped
cellsApi.ReplaceContentInRemoteRange(
new ReplaceContentInRemoteRangeRequest(
name: "Book1.xlsx",
searchText: "Old Vendor Ltd",
replaceText: "Northwind Traders",
worksheet: "Q3 Forecast",
cellarea: "A1:F40",
folder: "Reports"));
Thay thế tại chỗ có tính phá hủy theo thiết kế. Các biến thể đám mây sẽ ghi đè
{name}— không tạo bản sao lưu. Đối với quy trình làm việc yêu cầu kiểm toán cao, hãy giữ một bản sao có phiên bản (ví dụ: tải lênBook1-2026-09-11.xlsxtrước, sau đó thay thế) hoặc sử dụng biến thể tải lên cục bộ và tự lưu luồng trả về.
8. Kịch bản E: Tìm các liên kết hỏng trước khi người khác làm
Kiểm tra liên kết là tính năng tiềm năng ở đây — nó là loại thứ mà việc tự viết ra rất tẻ nhạt và bỏ qua lại gây xấu hổ. Tất cả bốn phạm vi đều khả dụng; biến thể tệp cục bộ là kiểm tra nhanh nhất:
# Local workbook, whole file
curl -X PUT "https://api.aspose.cloud/v4.0/cells/search/broken-links" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@Book1.xlsx"
# Cloud workbook, whole file
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/search/broken-links" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "folder=Reports"
# Cloud workbook, one worksheet
curl -X PUT "https://api.aspose.cloud/v4.0/cells/Book1.xlsx/worksheets/Links/search/broken-links" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "folder=Reports"
var broken = cellsApi.SearchSpreadsheetBrokenLinks(
new SearchSpreadsheetBrokenLinksRequest(
spreadsheet: "C:/audit/Book1.xlsx"));
foreach (var link in broken.BrokenLinks)
{
Console.WriteLine($"{link.Worksheet} {link.Position} -> {link.LinkAddress}");
}
Kết quả là một danh sách mà bạn có thể hành động trực tiếp: mỗi mục ghi tên sheet, vị trí và LinkAddress gây lỗi.
9. Thực tế, những gì được quét? (các chi tiết triển khai làm thay đổi kỳ vọng của bạn)
Đây là phần tách biệt một tích hợp hoạt động và một tích hợp bất ngờ. Đọc WorkbookExtension.cs, một tìm kiếm sẽ duyệt ba loại phần tử khác nhau trong mỗi bảng tính:
| Loại phần tử | Nguồn | Nội dung khớp | Position thẻ |
|---|---|---|---|
| Chuỗi ô | worksheet.Cells |
Giá trị chuỗi của ô | Cell:A1 |
| Liên kết siêu văn bản | worksheet.Hyperlinks |
Cả địa chỉ và văn bản hiển thị của liên kết | Hyperlink:Sheet1!B4 |
| Hình dạng | worksheet.Shapes |
shape.Text — hộp văn bản, chú thích, nhãn |
Shape:TextBox 3 |
Và đây là những hành vi đáng biết trước khi bạn thiết kế xung quanh chúng:
Chỉ các ô chứa chuỗi mới được tìm kiếm. Quá trình quét lọc dựa trên CellValueType.IsString. Một ô chứa số, ngày hoặc boolean sẽ bị bỏ qua — vì vậy việc tìm kiếm 2025 sẽ không khớp với ô định dạng ngày có giá trị serial trùng 2025. Các ô có công thức đánh giá thành văn bản được khớp, vì kiểu giá trị của chúng là chuỗi.
Phân biệt chữ hoa chữ thường là tùy chọn khớp duy nhất. ignoringCase chuyển đổi giữa InvariantCultureIgnoreCase và InvariantCulture — không gì hơn. Không có chế độ toàn từ, regex, hoặc “match entire cell value”, bất chấp những gì tài liệu API được tạo ra có thể gợi ý. Nếu bạn cần những ngữ nghĩa đó, hãy lấy danh mục all-textitems và lọc nó ở phía của bạn.
Thay thế là một phép thay thế đơn giản, phân biệt chữ hoa chữ thường, nguyên văn. Cờ ignoringCase của Search không có tương đương nào trong Replace — đường dẫn thay thế không có tham số không phân biệt chữ hoa chữ thường nào cả. Và hai luồng mã này khác nhau nội bộ: một thay thế toàn bộ worksheet ủy thác cho engine’s Worksheet.Replace(...), trong khi một thay thế theo phạm vi vùng lặp lại vùng và ghi lại mỗi ô chuỗi bằng cell.StringValue.Replace(...). Hệ quả thực tế: thay thế theo phạm vi vùng chỉ ảnh hưởng đến các ô chuỗi, và nó là nguyên văn, không dựa trên mẫu.
Kết quả khớp siêu liên kết báo cáo địa chỉ, không phải chú thích. Khi một tìm kiếm khớp với văn bản hiển thị của siêu liên kết, Content trả về vẫn là hyperlink.Address. Nếu bạn đang tạo báo cáo “found it here”, hãy mong đợi URL — chú thích sẽ không được lặp lại.
Kiểm tra liên kết hỏng chỉ xem xét http:// và https://. mailto: links, local file paths, và internal #Sheet1!A1 anchors được bỏ qua hoàn toàn — chúng không bao giờ được kiểm tra, vì vậy sẽ không xuất hiện trong kết quả. Nó cũng quét các hyperlink được gắn vào shapes cũng như các ô, nơi các liên kết chết thường ẩn náu. Lưu ý rằng một Position của broken-link được xây dựng từ hyperlink.Area thô (không phải Area.ToRangName() thân thiện mà các endpoint tìm kiếm sử dụng), vì vậy đừng cho rằng hai họ này hiển thị vị trí một cách giống nhau — hãy phân tích cặp Worksheet + LinkAddress nếu bạn cần một khóa ổn định.
“Broken” có nghĩa là “không thể tiếp cận”, không phải “mã trạng thái sai”. Kiểm tra gửi một yêu cầu HTTP HEAD cho mỗi liên kết và coi bất kỳ phản hồi nào — bao gồm 404 hoặc 500 — là có thể truy cập; nó chỉ đánh dấu một liên kết là bị hỏng khi yêu cầu ném (lỗi DNS, kết nối bị từ chối, lỗi TLS, thời gian chờ). Vì vậy hãy coi đầu ra là “các liên kết không thể liên lạc”. Nếu những gì bạn thực sự cần là “các liên kết không trả về 2xx”, bạn sẽ muốn kiểm tra lại các giá trị LinkAddress đã trả về bằng chính mình.
cellArea được chấp nhận nhưng không được áp dụng trên các endpoint broken-link. Việc thực thi BrokenLinks chỉ lọc theo tên worksheet; đối số cell-area được truyền vào nhưng không bao giờ được sử dụng. Thực tế có nghĩa là .../ranges/A1:F40/search/broken-links hiện đang hoạt động giống như /worksheet/search/broken-links cho cùng một worksheet — các liên kết được xác thực trên toàn bộ sheet. Hãy điều chỉnh phạm vi báo cáo của bạn cho phù hợp (hoặc lọc danh sách trả về theo vị trí) thay vì cho rằng phạm vi sẽ thu hẹp việc kiểm tra.
Không có gì trong số này là rào cản — chúng là sự khác biệt giữa một tính năng “hoạt động trong bản demo” và một tính năng hành xử dự đoán được trong môi trường sản xuất.
10. Xử lý lỗi & ghi chú vận hành
Hợp đồng mà bộ điều khiển ghi lại
| Status | Meaning | Typical cause |
|---|---|---|
| 400 | Yêu cầu không hợp lệ | URL/đối số không hợp lệ — ví dụ: cellArea sai định dạng, hoặc thiếu searchText |
| 401 | Không được ủy quyền | Xác thực thất bại hoặc không có thông tin xác thực hợp lệ được cung cấp |
| 404 | Không tìm thấy | Tệp nguồn không thể truy cập trong lưu trữ đám mây |
| 500 | Lỗi máy chủ | Dịch vụ gặp bất thường khi lấy dữ liệu bảng tính |
Nội bộ, mỗi hành động đều bao bọc công việc của nó trong một helper (WorkbookElementOperation, UpdateWorkbookElementOperation, UpdateWorkbookElementOperationAndSave) mà bắt các lỗi và ném lại chúng dưới dạng CellsApiException được tiền tố bằng tên thao tác — ví dụ SearchContentInRemoteRange Error Message: .... Tên thao tác đó là chuỗi bạn sẽ thấy trong nhật ký của mình:
| Tên thao tác | Nhóm endpoint |
|---|---|
SearchSpreadsheetContent, SearchContentInRemoteSpreadsheet |
Tìm kiếm cục bộ / từ xa |
SearchContentInRemoteWorksheet, SearchContentInRemoteRange |
Tìm kiếm từ xa có phạm vi |
ReplaceSpreadsheetContent |
Thay thế cục bộ (kết quả luồng) |
ReplaceContentInRemoteSpreadsheet, ReplaceContentInRemoteWorksheet, ReplaceContentInRemoteRange |
Thay thế từ xa (lưu kết quả) |
SearchSpreadsheetBrokenLinks, SearchBrokenLinksInRemoteSpreadsheet, SearchBrokenLinksInRemoteWorksheet, SearchBrokenLinksInRemoteRange |
Xác thực liên kết |
Các tham số tùy chọn mà SDK cung cấp
Ngoài các tham số đã được tài liệu ghi chú, các mô hình yêu cầu lưu trữ đám mây đều có cùng ba cài đặt tùy chọn:
password— mở một workbook được bảo vệ bằng mật khẩu (tìm kiếm không yêu cầu quyền ghi, vì vậy các tệp chỉ đọc vẫn hoạt động tốt);storageName— chỉ định một lưu trữ đám mây tùy chỉnh/đính kèm thay vì mặc định (Python:storage_name);regoin— cài đặt khu vực/địa phương được sử dụng khi giải thích workbook (Python viết làregion).
Xác thực
Tất cả các SDK tự động xác thực bằng OAuth 2.0 client_credentials và JWT; khi sử dụng raw cURL, hãy gọi /connect/token một lần trước (xem §4, ①).
11. Tại sao Aspose.Cells Cloud cho tìm kiếm & thay thế?
- ✅ Không phụ thuộc cục bộ — không cần Office/Excel, không COM, không máy chủ kịch bản. Có thể gọi từ bất kỳ ngôn ngữ nào, bất kỳ nền tảng nào (Linux, containers, serverless);
- ✅ Sâu hơn tìm kiếm văn bản — cells, shapes và hyperlinks đều là mục tiêu khớp cấp một, chính là nơi các bảng tính thực tế lưu trữ nội dung;
- ✅ Các thao tác có phạm vi — workbook / worksheet / range, vì vậy bạn có thể sửa một vùng của một sheet mà không cần ghi lại toàn bộ tệp 50 MB;
- ✅ Được thiết kế cho đám mây hoặc không trạng thái — files already in storage never leave it; local-upload operations persist nothing at all;
- ✅ Viết lại độ trung thực cao — replacements are applied through the Aspose.Cells engine and re-serialized, so formulas, styles, charts and formatting survive the round trip;
- ✅ Một mô hình duy nhất trên các SDK — the cURL, .NET, Python and Java surfaces map 1:1, so the pattern you copy from one language works in the others.
Bắt đầu ngay: đăng ký trên Aspose Cloud Dashboard, tạo một Ứng dụng, chèn thông tin xác thực của bạn vào bất kỳ đoạn mã nào ở trên, và chỉ nó tới một trong các workbook của bạn — bạn sẽ có một cuộc kiểm tra nội dung hoạt động trong vài phút.
Bạn thấy hữu ích? Hãy đánh sao, đánh dấu hoặc chia sẻ — và cho chúng tôi biết trong bình luận bạn đang sử dụng tính năng tìm và thay thế trong workbook cho mục đích gì.