Βρείτε το, Διορθώστε το, Επικυρώστε το: Ένας πλήρης οδηγός για το Aspose.Cells Cloud Search, Replace & Broken-Link API (.NET / Python / Java / cURL)

“Ποιο από τα 400 βιβλία προϋπολογισμού μας εξακολουθεί να λέει Old Vendor Ltd?” “Αντικαταστήστε κάθε σύμβολο κράτησης θέσης {{COMPANY}} σε αυτό το πρότυπο.” “Κάποια από τις αναφορές μας εξακολουθεί να συνδέεται με εκείνο το domain που αποσύραμε πέρυσι;” — τρία πολύ διαφορετικά ερωτήματα, μια κοινή απάντηση: μια κλήση REST που διαβάζει και ξαναγράφει τα υπολογιστικά φύλλα στο σύννεφο, χωρίς να είναι εγκατεστημένο το Excel πουθενά.

Τα προβλήματα περιεχόμενο υπολογιστικών φύλλων εμφανίζονται σχεδόν σε κάθε κώδικα με μεγάλο όγκο δεδομένων:

  • Έλεγχος περιεχομένου — εντοπισμός κάθε κελιού, σχήματος ή υπερσυνδέσμου που αναφέρει ένα αποσυρμένο όνομα προϊόντος, μια παλιά διεύθυνση γραφείου ή μια παλαιά νομική οντότητα;
  • Απόδοση προτύπου — συμπλήρωση των διακριτικών {{PLACEHOLDER}} σε όλα τα φύλλα πριν την αποστολή ενός βιβλίου εργασίας σε πελάτη;
  • Φθορά συνδέσμων — έλεγχος ότι οι URL που ενσωματώνονται σε ένα βιβλίο εργασίας εξακολουθούν να λειτουργούν, πριν μια εργασία συμμόρφωσης ή αρχειοθέτησης το εγκρίνει;
  • Μαζική διόρθωση — διόρθωση τυπογραφικού λάθους ή λανθασμένης τιμής στήλης σε δεκάδες φύλλα, ή περιορισμένη σε μία μόνο περιοχή ενός φύλλου.

Οι παραδοσιακές επιλογές — μια βιβλιοθήκη σεναρίων που τρέχει στον δικό σας υπολογιστή, ένα μακροεντολή Excel ή ένα στοιχείο COM σε έναν διακομιστή Windows — σημαίνουν ότι εσείς είστε αυτός που φιλοξενεί και κλιμακώνει τη λογική των υπολογιστικών φύλλων. Aspose.Cells Cloud τη μετατρέπει σε απλό REST: στείλτε ένα αρχείο (ή απλώς ένα όνομα αρχείου), λάβετε ταιριάσματα — ή ένα διορθωμένο αρχείο — πίσω.

Αυτή η ανάρτηση περιηγείται στα API που εκτίθενται από τον βασικό SearchController στο Aspose.Cells Cloud microservice (πηγή: src/Aspose.Cells.Cloud.MicroService/Controllers/SearchController.cs), με παραδείγματα εκτέλεσης σε cURL και C# (.NET), καθώς και σημειώσεις για χρήστες Python και Java.

1. Τι μπορεί να κάνει ο SearchController;

SearchController καλύπτει τρεις οικογένειες δυνατοτήτων, καθεμία διαθέσιμη σε αρκετές εμβέλειες:

Family What it does Mutates the workbook?
Αναζήτηση Επιστρέφει τα στοιχεία κειμένου που ταιριάζουν με ένα ερώτημα — μαζί με τη θέση τους στο φύλλο και το κελί/σχήμα/υπερσύνδεσμο No
Αντικατάσταση Αντικαθιστά το ταιριασμένο κείμενο, μετά είτε μεταδίδει το διορθωμένο αρχείο πίσω είτε το αποθηκεύει σε αποθήκευση cloud Yes
Σπασμένοι σύνδεσμοι Επικυρώνει κάθε υπερσύνδεσμο http(s) στο βιβλίο εργασίας και επιστρέφει εκείνους που δεν μπορούν να επιλυθούν No

Κάθε οικογένεια εκτίθεται σε τέσσερις περιοχές, όπου η λίστα των τελικών σημείων γίνεται μεγάλη:

Πεδίο εφαρμογής Αναζήτηση Αντικατάσταση Σπασμένοι σύνδεσμοι
Τοπικό αρχείο → διαδικτυακή επεξεργασία (μεταφόρτωση στο σώμα του αιτήματος) PUT /v4.0/cells/search/content PUT /v4.0/cells/replace/content PUT /v4.0/cells/search/broken-links
Ολόκληρο βιβλίο εργασίας στην αποθήκευση cloud PUT /v4.0/cells/{name}/search/content PUT /v4.0/cells/{name}/replace/content PUT /v4.0/cells/{name}/search/broken-links
Μονό φύλλο εργασίας στην αποθήκευση cloud 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
Μονή περιοχή στην αποθήκευση cloud 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

Πρόσθετα δύο επιπλέον τελικά σημεία που εξάγουν κάθε στοιχείο κειμένου σε ένα βιβλίο εργασίας — δείτε §4:

Στόχος Τερματικό σημείο
Όλα τα στοιχεία κειμένου σε αρχείο στο σύννεφο PUT /v4.0/cells/{name}/search/content/all-textitems
Όλα τα στοιχεία κειμένου σε τοπική μεταφόρτωση PUT /v4.0/cells/search/content/all-textitems

Σημείωση υλοποίησης: οι διαδρομές προσαρτώνται με πρόθεμα v{version:apiVersion}/cells και αυτός ο ελεγκτής είναι [ApiVersion("4.0")], έτσι οι ζωντανές κλήσεις φαίνονται όπως https://api.aspose.cloud/v4.0/cells/.... Όλα σε αυτόν τον ελεγκτή είναι PUT — ακόμη και οι αναγνώσεις μόνο για ανάγνωση — επειδή μια αναζήτηση μοντελοποιείται ως μια λειτουργία που υποβάλλεται σε έναν πόρο, όχι ως cacheable GET.

Οι δύο λειτουργικές λειτουργίες, και γιατί είναι σημαντικές

Ο ελεγκτής διακοσμεί κάθε ενέργεια, και ο διακοσμητής σας λέει ακριβώς από πού προέρχεται το αρχείο:

  • [OnlineOperation] — χωρίς κατάσταση. Ανεβάζετε το βιβλίο εργασίας στο σώμα του αιτήματος (multipart), ο διακομιστής το επεξεργάζεται στη μνήμη και τίποτα δεν αποθηκεύεται σε αποθήκευση cloud. Ιδανικό για “απλώς πες μου τι υπάρχει σε αυτό το αρχείο” και για μονόπλοκη δημιουργία προτύπων.
  • [CloudFileOperation] — με υποστήριξη αποθήκευσης. Ο διακομιστής ανακτά το {name} από την αποθήκευση cloud (προαιρετικά υπό folder=), εκτελεί τη δουλειά και — για τις λειτουργίες αντικατάστασης — γράφει το αποτέλεσμα απευθείας πίσω. Τίποτα δεν μεταφέρεται στον υπολογιστή σας.

Αυτή η μοναδική διάκριση, συν μαζί με τα τμήματα διαδρομής {worksheet} / {cellArea}, αποτελεί ολόκληρο το νοητικό μοντέλο. Το υπόλοιπο αυτού του άρθρου είναι απλώς οι λεπτομέρειες.

2. Τα μοντέλα απάντησης που θα επεξεργαστείτε στην πραγματικότητα

Και οι δύο οικογένειες αναζήτησης επιστρέφουν ένα μικρό, επίπεδο, εύκολο στη σύνδεση σχήμα. Η αναζήτηση επιστρέφει 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"
    }
  ]
}

Η αναζήτηση σπασμένων συνδέσμων επιστρέφει BrokenLinksResponse:

{
  "Code": 200,
  "Status": "OK",
  "BrokenLinks": [
    {
      "Filename": "Book1.xlsx",
      "Worksheet": "Links",
      "Position": "Hyperlink:Sheet1!B4",
      "LinkAddress": "https://retired-domain.example.com/report"
    }
  ]
}

Δύο πράγματα αξίζει να επισημανθούν αμέσως:

  1. Position είναι μια ετικετοποιημένη θέση, όχι μόνο μια διεύθυνση κελιού. Προστίθεται πρόθεμα Cell:, Hyperlink: ή Shape:, που είναι ο τρόπος με τον οποίο μια ενιαία επίπεδη λίστα μπορεί να σας πει ποιο είδος αντικειμένου ταιριάζει. Αυτή η ετικέτα είναι η διαφορά μεταξύ «διορθώστε το κελί B7» και «διορθώστε το πλαίσιο κειμένου που βρίσκεται πάνω από το B7».
  2. Και τα δύο μοντέλα είναι αυτό-περιγραφικά για αναφορές — Filename και Worksheet επιστρέφονται σε κάθε στοιχείο, ώστε μια σάρωση σε πολλά βιβλία εργασίας να μπορεί να συνενωθεί σε έναν πίνακα ελέγχου χωρίς μετα-επεξεργασία.

3. Δύο πράγματα που χρειάζεστε πριν ξεκινήσετε

  1. Εγγραφείτε δωρεάν στο Aspose Cloud Dashboard και δημιουργήστε μια Εφαρμογή για να λάβετε ένα Client ID και ένα Client Secret (τα SDK ανταλλάσσουν αυτά αυτόματα για ένα JWT — δεν χρειάζεται να δημιουργήσετε εσείς τις κεφαλίδες εξουσιοδότησης).
  2. Εγκαταστήστε το SDK για τη γλώσσα της επιλογής σας:
<!-- .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>

Δεν απαιτείται SDK; Όλα είναι απλό REST, έτσι το cURL λειτουργεί εξίσου καλά (δείτε παρακάτω). Η οικογένεια αναζήτησης/αντικατάστασης/σπασμένων συνδέσμων είναι επίσης προσβάσιμη μέσω τυποποιημένων μοντέλων αιτήσεων SDK — SearchSpreadsheetContentRequest, ReplaceContentInRemoteRangeRequest και φίλοι — που είναι αυτά που χρησιμοποιούν τα παρακάτω αποσπάσματα C#.

4. Σενάριο A: Αναζήτηση τοπικού αρχείου online (χωρίς αποθήκευση)

Αυτή είναι PUT /v4.0/cells/search/content — ανεβάστε το βιβλίο εργασίας, λάβετε τις αντιστοιχίες. Χωρίς αποθήκευση στο σύννεφο, χωρίς καθαρισμό, χωρίς αντίγραφο που να μένει πίσω.

① 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"

Συμπτύξτε το σε ένα φύλλο ή σε μια περιοχή ενός φύλλου, με δύο επιπλέον παραμέτρους ερωτήματος:

# 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");

Τα μοντέλα αιτήματος εκθέτουν επίσης το password (άνοιγμα προστατευμένου βιβλίου εργασίας) και το regoin (ρύθμιση περιοχής/locale) — τις ίδιες προαιρετικές παραμέτρους που θα δείτε στις παραλλαγές cloud‑storage ως storageName. Σημειώστε ότι το .NET SDK διατηρεί την ορθογραφία regoin; το Python SDK ονομάζει τις ίδιες δύο ρυθμίσεις password και region.

③ Python / Java

Το Python SDK περιβάλλει την ίδια οικογένεια τελικών σημείων, με τα πεδία του μοντέλου αιτήματος να αντιστοιχούν στα πεδία της C# ένα προς ένα, αλλά σε 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 ακολουθεί την ίδια μορφή με αντικείμενα Request που δημιουργούνται μέσω setters:

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()));
    }
}

Εάν χρησιμοποιείτε ακατέργαστο REST, το παραπάνω cURL είναι η πλήρης σύμβαση — το πεδίο multipart πρέπει απλώς να μεταφέρει το όνομα αρχείου, επειδή η υπηρεσία αντλεί το όνομα του βιβλίου εργασίας (και συνεπώς τη μορφή του) από αυτό.


5. Σενάριο B: Αναζήτηση αρχείου που ήδη βρίσκεται στην αποθήκη cloud

Όταν το βιβλίο εργασίας βρίσκεται ήδη στην Aspose Cloud Storage, παραλείψτε εντελώς τη λήψη — η υπηρεσία το διαβάζει από την τοποθεσία του.

# 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"));

Γιατί τρία endpoints αντί για ένα; Επειδή η διαδρομή μεταφέρει το πεδίο εφαρμογής. Το endpoint ολόκληρου του workbook παίρνει ένα όνομα και ένα ερώτημα· το endpoint του φύλλου εργασίας παίρνει ένα τμήμα φύλλου εργασίας· το endpoint του εύρους παίρνει ένα φύλλο εργασίας και ένα τμήμα εύρους. Είναι μια καθαρή, cacheable REST μορφή — και σημαίνει ότι οι παράμετροι «συστοίχισης αναζήτησης» (worksheet, cellArea) υπάρχουν μόνο στο endpoint τοπικού αρχείου, κάτι που αξίζει να θυμάστε όταν μεταφέρετε μια κλήση από ένα πεδίο σε άλλο.

6. Σενάριο C: Αποκτήστε κάθε στοιχείο κειμένου σε ένα βιβλίο εργασίας

Μερικές φορές δεν έχετε όρο αναζήτησης — θέλετε το απόθεμα. Τα endpoints all-textitems επιστρέφουν κάθε στοιχείο κειμένου στο βιβλίο εργασίας, ώστε να μπορείτε να συγκρίνετε δύο εκδόσεις, να δημιουργήσετε ένα γλωσσάρι μετάφρασης ή να τροφοδοτήσετε έναν ευρετηριαστή:

# 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"

Η απάντηση είναι το ίδιο φάκελο SearchResponse, με το Content να είναι γεμάτο για κάθε συμβολοσειρά κελιού, λεζάντα υπερσυνδέσμου και κείμενο σχήματος στο αρχείο. Αυτό είναι το primitive “grep the whole workbook”.

7. Σενάριο D: Αντικατάσταση — και τα δύο πολύ διαφορετικά αποτελέσματα

Το Replace είναι το σημείο όπου το API χωρίζεται σε δύο, και ο διαχωρισμός είναι σκόπιμος:

Τοπική μεταφόρτωση → κατεβάστε το διορθωμένο αρχείο Αρχείο στο cloud → αποθηκεύεται ξανά στην αποθήκευση
Τελικό σημείο PUT /v4.0/cells/replace/content PUT /v4.0/cells/{name}/replace/content
Επιστρέφει Ένα ροή αρχείου (ίδιο μορφή όπως ανέβηκε) CellsCloudResponse { "Code": 200, "Status": "OK" }
Αποθήκευση επηρεάζεται Κανένα Το αρχικό αρχείο αντικαθίσταται

① Αντικατάσταση σε τοπικό βιβλίο εργασίας, ροή του αποτελέσματος πίσω

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");

Δύο παράμετροι εμβέλειας είναι επίσης διαθέσιμες εδώ — sheetname και cellarea — ώστε να μπορείτε να αποδίδετε σύμβολα κράτησης θέσης σε ένα φύλλο χωρίς να αγγίζετε το υπόλοιπο του προτύπου.

② Αντικατάσταση σε ένα cloud workbook, διατήρηση στη θέση

# 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"));

Η αντικατάσταση επί τόπου είναι καταστροφική από τη φύση της. Οι εκδόσεις cloud αντικαθιστούν το {name} — δεν δημιουργείται αντίγραφο ασφαλείας. Για ροές εργασίας με έντονη ανάγκη ελέγχου, διατηρήστε ένα αναθεωρημένο αντίγραφο (π.χ. ανεβάστε πρώτα το Book1-2026-09-11.xlsx, έπειτα αντικαταστήστε) ή χρησιμοποιήστε την έκδοση local‑upload και αποθηκεύστε τη ροή που επιστρέφεται εσείς.

8. Σενάριο Ε: Βρείτε σπασμένους συνδέσμους πριν το κάνει κάποιος άλλος

Ο έλεγχος συνδέσμων είναι η κρυφή λειτουργία εδώ — είναι το είδος του πράγματος που είναι κουραστικό να το γράψεις μόνος σου και ντροπιαστικό να το παραλείψεις. Διατίθενται και οι τέσσερις περιοχές· η παραλλαγή τοπικού αρχείου είναι ο πιο γρήγορος έλεγχος λογικής:

# 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}");
}

Το αποτέλεσμα είναι μια λίστα που μπορείτε να επεξεργαστείτε απευθείας: κάθε καταχώρηση ονομάζει το φύλλο, τη θέση και το προβληματικό LinkAddress.

9. Τι σαρώνεται πραγματικά; (οι λεπτομέρειες υλοποίησης που αλλάζουν τις προσδοκίες σας)

Αυτό είναι το μέρος που διαχωρίζει μια λειτουργική ενσωμάτωση από μια εκπληκτική. Διαβάζοντας WorkbookExtension.cs, μια αναζήτηση διασχίζει τρεις διαφορετικούς τύπους στοιχείων σε κάθε φύλλο εργασίας:

Τύπος στοιχείου Πηγή Τι ταιριάζει Position ετικέτα
Συμβολοσειρές κελιού worksheet.Cells Η συμβολοσειρά του κελιού Cell:A1
Υπερσυνδέσμους worksheet.Hyperlinks Τόσο η διεύθυνση και το κείμενο εμφάνισης του συνδέσμου Hyperlink:Sheet1!B4
Σχήματα worksheet.Shapes shape.Text — πλαίσια κειμένου, επεξηγήσεις, ετικέτες Shape:TextBox 3

Και εδώ είναι οι συμπεριφορές που αξίζει να γνωρίζετε πριν σχεδιάσετε γύρω τους:

Μόνο τα κελιά κειμένου αναζητούνται. Η σάρωση φιλτράρει με βάση το CellValueType.IsString. Ένα κελί που περιέχει έναν αριθμό, μια ημερομηνία ή ένα boolean παραλείπεται — έτσι μια αναζήτηση για 2025 δεν θα ταιριάξει ένα κελί μορφοποιημένο ως ημερομηνία του οποίου η σειριακή τιμή είναι τυχαία 2025. Τα κελιά των οποίων οι τύποι αξιολογούνται σε κείμενο είναι ταιριαστά, επειδή ο τύπος τιμής τους είναι κείμενο.

Η ευαισθησία σε πεζά/κεφαλαία είναι η μόνη επιλογή αντιστοίχισης. ignoringCase εναλλάσσει μεταξύ InvariantCultureIgnoreCase και InvariantCulture σύγκρισης — τίποτα περισσότερο. Δεν υπάρχει λειτουργία ολόκληρης λέξης, regex ή λειτουργία «αντιστοίχηση ολόκληρης τιμής κελιού», παρά τα όσα μπορεί να υποδεικνύουν τα παραγόμενα API docs. Εάν χρειάζεστε αυτές τις σημασιολογίες, τραβήξτε το απόθεμα all-textitems και φιλτράρετε το από τη δική σας πλευρά.

Η αντικατάσταση είναι απλή, ευαίσθητη σε πεζά/κεφαλαία, κυριολεκτική αντικατάσταση. Η σημαία ignoringCase της Αναζήτησης δεν έχει καμία ισοδύναμη στην Αντικατάσταση — η διαδρομή αντικατάστασης δεν έχει καθόλου παράμετρο αδιαφορίας πεζών/κεφαλαίων. Και οι δύο διαδρομές κώδικα διαφέρουν εσωτερικά: μια αντικατάσταση ολόκληρου φύλλου εργασίας αναθέτει στο Worksheet.Replace(...) της μηχανής, ενώ μια αντικατάσταση περιορισμένη σε περιοχή επαναλαμβάνει την περιοχή και ξαναγράφει κάθε κελί κειμένου με cell.StringValue.Replace(...). Πρακτικό αποτέλεσμα: η αντικατάσταση περιορισμένη σε περιοχή αγγίζει μόνο κελιά κειμένου, και είναι κυριολεκτική, όχι βασισμένη σε πρότυπο.

Οι αντιστοιχίες υπερσυνδέσμων αναφέρουν τη διεύθυνση, όχι τη λεζάντα. Όταν μια αναζήτηση ταιριάζει με το κείμενο εμφάνισης ενός υπερσυνδέσμου, το επιστρεφόμενο Content είναι ακόμη hyperlink.Address. Εάν δημιουργείτε μια αναφορά «found it here», περιμένετε το URL — η λεζάντα δεν επαναλαμβάνεται.

Ο έλεγχος σπασμένων συνδέσμων ελέγχει μόνο τα http:// και https://. Οι σύνδεσμοι mailto: , οι τοπικές διαδρομές αρχείων και οι εσωτερικές άγκυρες #Sheet1!A1 παραλείπονται εντελώς — δεν ελέγχονται ποτέ, επομένως δεν θα εμφανιστούν ποτέ στα αποτελέσματα. Επίσης σαρώνονται οι υπερσύνδεσμοι που είναι συνδεδεμένοι σε σχήματα καθώς και σε κελιά, που είναι ακριβώς εκεί που κρύβονται οι νεκροί σύνδεσμοι. Σημειώστε ότι ένα σπασμένο-σύνδεσμο Position δημιουργείται από το ακατέργαστο hyperlink.Area (όχι το πιο φιλικό Area.ToRangName() που χρησιμοποιούν τα σημεία αναζήτησης), οπότε μην υποθέτετε ότι οι δύο οικογένειες αποδίδουν τις θέσεις με τον ίδιο τρόπο — αναλύστε το ζεύγος Worksheet + LinkAddress εάν χρειάζεστε ένα σταθερό κλειδί.

“Broken” σημαίνει “μη προσβάσιμο”, όχι “λάθος κωδικός κατάστασης”. Η διαδικασία ελέγχου εκτελεί ένα αίτημα HTTP HEAD για κάθε σύνδεσμο και θεωρεί οποιαδήποτε απόκριση — συμπεριλαμβανομένων των 404 ή 500 — ως προσβάσιμη· σημειώνει έναν σύνδεσμο ως σπασμένο μόνο όταν το αίτημα ρίχνει (αποτυχία DNS, άρνηση σύνδεσης, σφάλμα TLS, λήξη χρόνου). Έτσι θεωρήστε το αποτέλεσμα ως “σύνδεσμοι που δεν μπορούσαν να προσεγγιστούν”. Αν αυτό που χρειάζεστε πραγματικά είναι “σύνδεσμοι που δεν επιστρέφουν 2xx”, θα θέλετε να ελέγξετε ξανά τις επιστρεφόμενες τιμές LinkAddress μόνοι σας.

cellArea γίνεται αποδεκτό αλλά δεν εφαρμόζεται στα endpoints broken-link. Η υλοποίηση BrokenLinks φιλτράρει μόνο με βάση το όνομα του φύλλου εργασίας· το όρισμα cell-area περνάει αλλά δεν χρησιμοποιείται ποτέ. Στην πράξη αυτό σημαίνει ότι το .../ranges/A1:F40/search/broken-links αυτή τη στιγμή συμπεριφέρεται το ίδιο όπως το /worksheet/search/broken-links για το ίδιο φύλλο εργασίας — οι σύνδεσμοι επικυρώνονται σε ολόκληρο το φύλλο. Προσαρμόστε το reports σας ανάλογα (ή φιλτράρετε τη λίστα που επιστρέφεται κατά θέση) αντί να υποθέτετε ότι το εύρος περιορίζει τον έλεγχο.

Κανένα από αυτά δεν αποτελεί εμπόδιο — είναι η διαφορά μεταξύ μιας λειτουργίας που “λειτουργεί στη demo” και μιας που συμπεριφέρεται προβλέψιμα στην παραγωγή.


10. Διαχείριση σφαλμάτων & επιχειρησιακές σημειώσεις

Η σύμβαση που τεκμηριώνει ο ελεγκτής

Κατάσταση Σημασία Τυπική αιτία
400 Κακό Αίτημα Μη έγκυρο URL/παράμετροι — π.χ. εσφαλμένη cellArea, ή έλλειψη searchText
401 Μη εξουσιοδοτημένο Αποτυχία πιστοποίησης ή δεν παρέχθηκαν έγκυρα διαπιστευτήρια
404 Δεν βρέθηκε Το αρχείο προέλευσης δεν είναι προσβάσιμο στην αποθήκευση cloud
500 Σφάλμα διακομιστή Η υπηρεσία αντιμετώπισε μια ανωμαλία κατά την απόκτηση δεδομένων λογιστικού φύλλου

Εσωτερικά, κάθε ενέργεια τυλίγει τη δουλειά της σε έναν βοηθό (WorkbookElementOperation, UpdateWorkbookElementOperation, UpdateWorkbookElementOperationAndSave) που εντοπίζει αποτυχίες και τις επανεκτοξεύει ως CellsApiException με πρόθεμα το όνομα της λειτουργίας — για παράδειγμα SearchContentInRemoteRange Error Message: .... Το όνομα της λειτουργίας είναι η συμβολοσειρά που θα δείτε στα αρχεία καταγραφής σας:

Όνομα λειτουργίας Οικογένεια τελικού σημείου
SearchSpreadsheetContent, SearchContentInRemoteSpreadsheet Τοπική / απομακρυσμένη αναζήτηση
SearchContentInRemoteWorksheet, SearchContentInRemoteRange Περιορισμένη απομακρυσμένη αναζήτηση
ReplaceSpreadsheetContent Τοπική αντικατάσταση (αποτέλεσμα ροής)
ReplaceContentInRemoteSpreadsheet, ReplaceContentInRemoteWorksheet, ReplaceContentInRemoteRange Απομακρυσμένη αντικατάσταση (αποθηκεύει το αποτέλεσμα)
SearchSpreadsheetBrokenLinks, SearchBrokenLinksInRemoteSpreadsheet, SearchBrokenLinksInRemoteWorksheet, SearchBrokenLinksInRemoteRange Επικύρωση συνδέσμων

Προαιρετικές παράμετροι που εκθέτουν τα SDK

Πέρα από τις τεκμηριωμένες παραμέτρους, τα μοντέλα αιτήσεων cloud-storage περιέχουν όλα τις ίδιες τρεις προαιρετικές ρυθμίσεις:

  • password — ανοίγει ένα βιβλίο εργασίας προστατευμένο με κωδικό (οι αναζητήσεις δεν απαιτούν πρόσβαση εγγραφής, οπότε τα αρχεία προστατευμένα μόνο για ανάγνωση λειτουργούν κανονικά);
  • storageName — στοχεύει σε προσαρμοσμένο/συνημμένο αποθηκευτικό χώρο στο σύννεφο αντί του προεπιλεγμένου (Python: storage_name);
  • regoin — η ρύθμιση περιοχής/τοπικής γλώσσας που χρησιμοποιείται κατά την ερμηνεία του βιβλίου εργασίας (Python γράφει αυτό region);

Πιστοποίηση

Όλα τα SDKs αυθεντοποιούνται αυτόματα με OAuth 2.0 client_credentials και JWT· όταν χρησιμοποιείτε ακατέργαστο cURL, καλέστε το /connect/token μία φορά πρώτα (δείτε §4, ①).

11. Γιατί το Aspose.Cells Cloud για αναζήτηση & αντικατάσταση;

  • ✅ Μηδενικές τοπικές εξαρτήσεις — χωρίς Office/Excel, χωρίς COM, χωρίς scripting host. Κλήσιμο από οποιαδήποτε γλώσσα, οποιαδήποτε πλατφόρμα (Linux, containers, serverless);
  • ✅ Βαθύτερη από αναζήτηση κειμένου — κελιά, σχήματα και υπερσυνδέσμους είναι όλα πρώτης τάξης στόχοι αντιστοίχισης, που είναι ακριβώς όπου τα πραγματικά λογιστικά φύλλα διατηρούν το περιεχόμενό τους;
  • ✅ Λειτουργίες με πεδίο εφαρμογής — workbook / worksheet / range, ώστε να μπορείτε να διορθώσετε μια περιοχή ενός φύλλου χωρίς να ξαναγράψετε ένα αρχείο 50 MB;
  • ✅ Cloud-native ή χωρίς κατάσταση — τα αρχεία που ήδη είναι στην αποθήκευση δεν φεύγουν ποτέ· οι λειτουργίες τοπικής μεταφόρτωσης δεν διατηρούν τίποτα·
  • ✅ Ανασυγγραφή υψηλής πιστότητας — οι αντικαταστάσεις εφαρμόζονται μέσω του κινητήρα Aspose.Cells και επανα-σειριοποιούνται, έτσι ώστε τύποι, στυλ, διαγράμματα και μορφοποίηση να επιβιώνουν το γύρο;
  • ✅ Ένα σχήμα σε όλα τα SDK — οι επιφάνειες cURL, .NET, Python και Java αντιστοιχούν 1:1, έτσι το μοτίβο που αντιγράφετε από μια γλώσσα λειτουργεί και στις άλλες.

Ξεκινήστε τώρα: εγγραφείτε στο Aspose Cloud Dashboard, δημιουργήστε μια Εφαρμογή, τοποθετήστε τα διαπιστευτήριά σας σε οποιοδήποτε απόσπασμα παραπάνω και στοχεύστε το σε ένα από τα δικά σας βιβλία εργασίας — θα έχετε έναν λειτουργικό έλεγχο περιεχομένου σε λίγα λεπτά.

Βρήκατε αυτό χρήσιμο; Προσθέστε αστέρι, σελιδοδείκτη ή μοιραστείτε το — και πείτε μας στα σχόλια για τι χρησιμοποιείτε την αναζήτηση και αντικατάσταση σε βιβλίο εργασίας.