Find det, ret det, valider det: En komplet guide til Aspose.Cells Cloud søg, erstat & brudt-link API (.NET / Python / Java / cURL)
“Hvilken af vores 400 budgetarbejdsbøger siger stadig Old Vendor Ltd?” “Erstat hver
{{COMPANY}}‑pladsholder i denne skabelon.” “Linker nogen af vores rapporter stadig til det domæne, vi afskaffede sidste år?” — tre meget forskellige spørgsmål, ét fælles svar: et REST‑kald, der læser og omskriver regneark i skyen, uden at Excel er installeret nogen steder.
Regneark indhold problemer dukker op i næsten alle datatunge kodebaser:
- Content audit — finde hver celle, form eller hyperlink, der nævner et forældet produktnavn, en gammel kontoradresse eller en forældet juridisk enhed;
- Template rendering — udfylde
{{PLACEHOLDER}}tokens på tværs af ark, før en arbejdsbog sendes til en kunde; - Link rot — kontrollere at URL’erne indlejret i en arbejdsbog stadig fungerer, før en compliance- eller arkiveringsopgave godkender den;
- Bulk correction — rette en stavefejl eller en fejlagtigt stavet kolonneværdi på tværs af dusinvis af ark, eller begrænset til kun én region i ét ark.
De traditionelle muligheder — et scriptbibliotek, der kører på din egen maskine, en Excel‑makro eller en COM‑komponent på en Windows‑server — betyder alle, at du er den, der hoster og skalerer regnearkslogikken. Aspose.Cells Cloud gør det til ren REST: send en fil (eller blot et filnavn), få matches — eller en korrigeret fil — tilbage.
Dette indlæg gennemgår API’erne, der eksponeres af den centrale SearchController i Aspose.Cells Cloud-mikrotjenesten (kilde: src/Aspose.Cells.Cloud.MicroService/Controllers/SearchController.cs), med kørbare eksempler i cURL og C# (.NET), samt noter til Python- og Java-brugere.
1. Hvad kan SearchController gøre?
SearchController dækker tre kapacitetsfamilier, hver tilgængelig på flere omfang:
| Familie | Hvad den gør | Ændrer projektmappen? |
|---|---|---|
| Søgning | Returnerer tekstelementerne, der matcher en forespørgsel — sammen med deres ark‑ og celle/figur/hyperlink‑position | Nej |
| Erstat | Erstatter den matchede tekst og sender derefter enten den korrigerede fil tilbage som en stream eller gemmer den i cloud‑lagring | Ja |
| Ødelagte links | Validerer hver http(s)‑hyperlink i projektmappen og returnerer dem, der ikke kan løses |
Nej |
Og hver familie er eksponeret i fire omfang, hvilket er hvor endpoint-listen bliver lang:
| Omfang | Søg | Erstat | Ødelagte links |
|---|---|---|---|
| Lokal fil → online behandling (upload i anmodningskroppen) | PUT /v4.0/cells/search/content |
PUT /v4.0/cells/replace/content |
PUT /v4.0/cells/search/broken-links |
| Hele projektmappe i cloud-lagring | PUT /v4.0/cells/{name}/search/content |
PUT /v4.0/cells/{name}/replace/content |
PUT /v4.0/cells/{name}/search/broken-links |
| Enkelt regneark i cloud-lagring | 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 |
| Enkelt område i cloud-lagring | 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 |
Plus to bonus‑endpoints, der dumper hver tekst‑element i en projektmappe — se §4:
| Mål | Endpoint |
|---|---|
| Alle tekstelementer i en cloud-fil | PUT /v4.0/cells/{name}/search/content/all-textitems |
| Alle tekstelementer i en lokal upload | PUT /v4.0/cells/search/content/all-textitems |
Implementationsnote: ruter er forudgående med
v{version:apiVersion}/cellsog denne controller er[ApiVersion("4.0")], så live‑kald ser ud somhttps://api.aspose.cloud/v4.0/cells/.... Alt i denne controller er enPUT— selv de skrivebeskyttede søgninger — fordi en søgning er modelleret som en handling indsendt mod en ressource, ikke en cache‑barGET.
De to driftsformer, og hvorfor de er vigtige
Controlleren dekorerer hver handling, og dekorationen fortæller dig præcis, hvor filen kommer fra:
[OnlineOperation]— stateless. Du uploader regnearket i anmodningskroppen (multipart), serveren behandler det i hukommelsen, og intet gemmes i cloud-lagringen. Perfekt til “bare fortæl mig hvad der er i denne fil” og til engangs‑templating.[CloudFileOperation]— storage-backed. Serveren henter{name}fra cloud-lagringen (valgfrit underfolder=), udfører arbejdet, og — for erstatningsoperationerne — skriver resultatet direkte tilbage. Intet sendes til din maskine.
Den eneste forskel, plus {worksheet} / {cellArea} rutesegmenterne, udgør hele den mentale model. Resten af dette indlæg er blot detaljerne.
2. De responsmodeller, du faktisk vil parse
Begge søgefamilier returnerer en lille, flad, let-at-binde form. Søgning returnerer 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"
}
]
}
Søgning efter ødelagte links returnerer BrokenLinksResponse:
{
"Code": 200,
"Status": "OK",
"BrokenLinks": [
{
"Filename": "Book1.xlsx",
"Worksheet": "Links",
"Position": "Hyperlink:Sheet1!B4",
"LinkAddress": "https://retired-domain.example.com/report"
}
]
}
To ting er værd at påpege med det samme:
Positioner en mærket placering, ikke kun en celleadresse. Den er forudgående medCell:,Hyperlink:ellerShape:, hvilket er hvordan en enkelt flad liste kan fortælle dig hvilken slags ting der matchede. Det mærke er forskellen mellem “fix cell B7” og “fix the text box sitting over B7”.- Begge modeller er selvbeskrivende for rapportering —
FilenameogWorksheetreturneres på hvert element, så en scanning på tværs af mange arbejdsbøger kan sammenkædes til én revisions‑tabel uden efterbehandling.
3. To ting, du har brug for, før du starter
- Registrer en gratis konto på Aspose Cloud Dashboard og opret en applikation for at få en
Client IDogClient Secret(SDK’erne udveksler disse for en JWT automatisk — ingen grund til at opbygge auth‑headers selv). - Installer SDK’en for det sprog, du foretrækker:
<!-- .NET -->
<PackageReference Include="Aspense.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>
Ingen SDK påkrævet? Alt er ren REST, så cURL fungerer lige så godt (se nedenfor). Søge/erstat/ødelagt‑link‑familien er også tilgængelig via typede SDK‑anmodningsmodeller —
SearchSpreadsheetContentRequest,ReplaceContentInRemoteRangeRequestog venner — som er hvad C#‑udsnittene nedenfor bruger.
4. Scenario A: Søg efter en lokal fil online (intet gemt)
Dette er PUT /v4.0/cells/search/content — upload regnearket, få tilbage matchene. Ingen cloud-lagring, ingen oprydning, ingen kopi efterladt.
① 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"
Begræns det til ét ark, eller til en region på ét ark, med to yderligere forespørgselsparametre:
# 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");
Anmodningsmodellerne eksponerer også
password(åbn en beskyttet projektmappe) ogregoin(region-/lokalindstilling) — de samme valgfrie parametre, du vil se på cloud-storage-varianterne somstorageName. Bemærk, at .NET SDK’en bevarer stavemådenregoin; Python SDK’en kalder de samme to indstillingerpasswordogregion.
③ Python / Java
Python SDK’en omslutter den samme endpoint-familie, hvor anmodningsmodelfelterne kortlægges til C#-felterne én-til-én, men i 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’en følger den samme struktur med Request-objekter oprettet via 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()));
}
}
Hvis du bruger rå REST, er cURL-kommandoen ovenfor den komplette kontrakt — multipart-feltet skal blot indeholde filnavnet, fordi tjenesten udleder regnearkets navn (og dermed dets format) ud fra det.
5. Scenario B: Søg efter en fil, der allerede findes i cloud-lagring
Når projektbogen allerede er i Aspose Cloud Storage, spring download helt over — tjenesten læser den, hvor den befinder sig:
# 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"));
Hvorfor tre endpoints i stedet for ét? Fordi ruten bærer omfanget. Hele‑arbejdsbog‑endpointet tager et navn og en forespørgsel; worksheet‑endpointet tager et worksheet‑segment; range‑endpointet tager et worksheet og et range‑segment. Det er en ren, cache‑venlig REST‑struktur — og det betyder, at “narrow my search”-parametrene (
worksheet,cellArea) kun findes kun på local‑file‑endpointet, hvilket er værd at huske, når du overfører et kald fra ét omfang til et andet.
6. Scenario C: Hent alle tekst‑elementer i en projektmappe
Nogle gange har du ikke et søgeord — du vil have lageret. all-textitems-endpoints returnerer alle tekstelementer i regnearket, så du kan sammenligne to revisioner, opbygge en oversættelsesglossar eller fodre en indekseringsmotor:
# 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"
Svaret er den samme SearchResponse‑omslag, med Content udfyldt for hver celle‑streng, hyperlink‑tekst og formtekst i filen. Dette er den “grep the whole workbook” primitive.
7. Scenario D: Erstat — og de to meget forskellige resultater
Replace er hvor API’en deles i to, og delingen er bevidst:
| Lokal upload → download den korrigerede fil | Cloud-fil → gemt tilbage til lageret | |
|---|---|---|
| Endpoint | PUT /v4.0/cells/replace/content |
PUT /v4.0/cells/{name}/replace/content |
| Returns | En filstrøm (samme format som du uploadede) | CellsCloudResponse { "Code": 200, "Status": "OK" } |
| Storage touched | Ingen | Den oprindelige fil er overskrevet |
① Erstat i en lokal arbejdsbog, stream resultatet tilbage
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");
To omfangsparametre er også tilgængelige her — sheetname og cellarea — så du kan gengive pladsholdere i ét ark uden at røre resten af skabelonen.
② Erstat i en cloud-arbejdsbog, gem den på stedet
# 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"));
Erstatning på stedet er destruktiv som design. Sky‑varianterne overskriver
{name}— der laves ingen sikkerhedskopi. For revisions‑tunge arbejdsgange skal du beholde en versioneret kopi (f.eks. uploadBook1-2026-09-11.xlsxførst, og erstat derefter) eller bruge den lokale upload‑variant og gemme den returnerede strøm selv.
8. Scenario E: Find brudte links, før nogen anden gør det
Linkkontrol er den sovende funktion her — det er den slags ting, der er kedelig at skrive selv og pinligt at springe over. Alle fire scopes er tilgængelige; den lokale fil-variant er den hurtigste sanity check:
# 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}");
}
Resultatet er en liste, du kan handle på direkte: hver post navngiver arket, positionen og den problematiske LinkAddress.
9. Hvad bliver faktisk scannet? (implementeringsdetaljerne, der ændrer dine forventninger)
Dette er den del, der adskiller en velfungerende integration fra en overraskende. Når du læser WorkbookExtension.cs, går en søgning gennem tre forskellige elementtyper i hvert regneark:
| Elementtype | Kilde | Hvad der matches | Position-tag |
|---|---|---|---|
| Celle‑strenge | worksheet.Cells |
Cellens strengværdi | Cell:A1 |
| Hyperlinks | worksheet.Hyperlinks |
Både linkets adresse og dens visningstekst | Hyperlink:Sheet1!B4 |
| Figurer | worksheet.Shapes |
shape.Text — tekstbokse, anmærkninger, etiketter |
Shape:TextBox 3 |
Og her er de adfærdsmønstre, der er værd at kende før du designer omkring dem:
Kun strengceller bliver søgt. Scanningen filtrerer på CellValueType.IsString. En celle, der indeholder et tal, en dato eller en boolesk værdi, springes over — så en søgning efter 2025 vil ikke matche en datoformateret celle, hvis serielle værdi tilfældigvis er 2025. Celler, hvis formler evaluerer til tekst, bliver matchet, fordi deres værditype er streng.
Case sensitivity er den eneste matchningsmulighed. ignoringCase skifter mellem InvariantCultureIgnoreCase og InvariantCulture sammenligning — intet mere. Der er ingen hel‑ord, regex eller “match entire cell value”-tilstand, på trods af hvad de genererede API‑dokumenter måske antyder. Hvis du har brug for den semantik, skal du hente all-textitems‑inventaret og filtrere det på din side.
Erstatning er simpel, case‑følsom, bogstavelig substitution. Søgningens ignoringCase‑flag har ingen ækvivalent i Erstatning — erstatningsstien har overhovedet ingen parameter for case‑insensitivitet. Og de to kodeveje adskiller sig internt: en hel‑ark‑erstatning delegere til motorens Worksheet.Replace(...), mens en område‑specifik erstatning itererer området og omskriver hver strengcelle med cell.StringValue.Replace(...). Praktisk konsekvens: område‑specifik erstatning påvirker kun strengceller, og den er bogstavelig, ikke mønstrebaseret.
Hyperlink‑match rapporterer adressen, ikke billedteksten. Når en søgning matcher en hyperlinks visningstekst, er den returnerede Content stadig hyperlink.Address. Hvis du genererer en “fundet her”-rapport, skal du forvente URL’en — billedteksten bliver ikke gengivet.
Kontrol af ødelagte links ser kun på http:// og https://. mailto:-links, lokale filstier og interne #Sheet1!A1-ankre springes helt over — de testes aldrig, så de vil aldrig vises i resultaterne. Den scanner også hyperlinks, der er knyttet til former såvel som celler, hvilket er præcis det sted, hvor døde links gemmer sig. Bemærk, at en ødelagt-link Position bygges ud fra den rå hyperlink.Area (ikke den mere brugervenlige Area.ToRangName(), som søgeendepunkterne bruger), så antag ikke, at de to familier gengiver positioner identisk — parse Worksheet + LinkAddress-parret, hvis du har brug for en stabil nøgle.
“Broken” betyder “unreachable”, ikke “forkert statuskode”. Kontrollen sender en HTTP HEAD‑anmodning pr. link og betragter enhver respons — inklusive 404 eller 500 — som tilgængelig; den markerer kun et link som brudt, når anmodningen kaster (DNS‑fejl, afvist forbindelse, TLS‑fejl, timeout). Så betragt outputtet som “links der ikke kunne kontaktes”. Hvis det du faktisk har brug for er “links der ikke returnerer 2xx”, vil du selv skulle tjekke de returnerede LinkAddress værdier igen.
cellArea er accepteret, men anvendes ikke på broken-link endpoints. Implementeringen af BrokenLinks filtrerer kun efter regnearksnavn; cell-område argumentet videregives, men bruges aldrig. I praksis betyder det, at .../ranges/A1:F40/search/broken-links i øjeblikket opfører sig på samme måde som /worksheet/search/broken-links for det samme regneark — links valideres på tværs af hele arket. Tilpas dine rapporter derefter (eller filtrer den returnerede liste efter position) i stedet for at antage, at området indsnævrer kontrollen.
Ingen af disse er hindringer — de er forskellen mellem en funktion, der “virker i demoen”, og en, der opfører sig forudsigeligt i produktion.
10. Fejlhåndtering & driftsnoter
Kontrakten som controlleren dokumenterer
| Status | Betydning | Typisk årsag |
|---|---|---|
| 400 | Ugyldig anmodning | Ugyldig URL/parametre — f.eks. et fejlagtigt cellArea, eller en manglende searchText |
| 401 | Uautoriseret | Godkendelse mislykkedes eller ingen gyldige legitimationsoplysninger blev angivet |
| 404 | Ikke fundet | Kildefilen er ikke tilgængelig i cloud-lagring |
| 500 | Serverfejl | Tjenesten stødte på en fejl, mens den hentede regnearksdata |
Internt pakker hver handling sit arbejde ind i en hjælper (WorkbookElementOperation, UpdateWorkbookElementOperation, UpdateWorkbookElementOperationAndSave), som fanger fejl og kaster dem igen som en CellsApiException med operationens navn som præfiks — for eksempel SearchContentInRemoteRange Error Message: .... Det operationens navn er den streng, du vil se i dine logfiler:
| Operationsnavn | Endpoint-familie |
|---|---|
SearchSpreadsheetContent, SearchContentInRemoteSpreadsheet |
Lokal / fjern søgning |
SearchContentInRemoteWorksheet, SearchContentInRemoteRange |
Afgrænset fjern søgning |
ReplaceSpreadsheetContent |
Lokal erstatning (streamer resultat) |
ReplaceContentInRemoteSpreadsheet, ReplaceContentInRemoteWorksheet, ReplaceContentInRemoteRange |
Fjern erstatning (gemmer resultat) |
SearchSpreadsheetBrokenLinks, SearchBrokenLinksInRemoteSpreadsheet, SearchBrokenLinksInRemoteWorksheet, SearchBrokenLinksInRemoteRange |
Linkvalidering |
Valgfrie parametre som SDK’erne eksponerer
Udover de dokumenterede parametre indeholder alle cloud‑storage anmodningsmodeller de samme tre valgfrie indstillinger:
password— åbn en adgangskodebeskyttet projektmappe (søgninger kræver ikke skriveadgang, så læsebeskyttede filer fungerer fint);storageName— målret en brugerdefineret/tilknyttet cloud-lagring i stedet for standarden (Python:storage_name);regoin— region/locale‑indstillingen, der bruges ved fortolkning af projektmappen (Python staver detteregion).
Godkendelse
Alle SDK’er autentificerer automatisk med OAuth 2.0 client_credentials og en JWT; når du bruger rå cURL, skal du først kalde /connect/token én gang (se §4, ①).
11. Hvorfor Aspose.Cells Cloud til søg & erstat?
- ✅ Ingen lokale afhængigheder — ingen Office/Excel, ingen COM, ingen scripting‑host. Kan kaldes fra ethvert sprog, enhver platform (Linux, containere, serverløse);
- ✅ Dybere end tekstsøgning — celler, former og hyperlinks er alle førsteklasses matchmål, som er præcis hvor rigtige regneark gemmer deres indhold;
- ✅ Omfangsbegrænsede operationer — projektmappe / regneark / område, så du kan rette et område i et ark uden at omskrive en 50 MB fil;
- ✅ Cloud‑native eller stateless — filer, der allerede er i lager, forlader det aldrig; lokale upload‑operationer gemmer intet overhovedet;
- ✅ Høj‑nøjagtig omskrivning — erstatninger anvendes gennem Aspose.Cells‑motoren og serialiseres igen, så formler, formater, diagrammer og formatering overlever rundrejsen;
- ✅ Én form på tværs af SDK’er — cURL‑, .NET‑, Python‑ og Java‑grænsefladerne kortlægger 1:1, så mønsteret du kopierer fra ét sprog fungerer i de andre.
Kom i gang nu: registrer dig på Aspose Cloud Dashboard, opret en Applikation, indsæt dine legitimationsoplysninger i et hvilket som helst kodeudsnit ovenfor, og peg den på en af dine egne arbejdsbøger — du vil have en fungerende indholdsrevision på få minutter.
Findt du dette nyttigt? Stjern, bogmærk eller del det — og fortæl os i kommentarerne, hvad du bruger arbejdsbogssøgning og -erstatning til.