מצא זאת, תקן זאת, אמת זאת: מדריך מלא ל‑Aspose.Cells Cloud API לחיפוש, החלפה וקישורים שבורים (.NET / Python / Java / cURL)

“איזה מהספרי תקציב שלנו (400) עדיין מציג את Old Vendor Ltd?” “החלף כל מציין מקום {{COMPANY}} בתבנית הזו.” “האם יש דוחות שלנו שעדיין מקשרים לדומיין שהשביתנו בשנה שעברה?” — שלוש שאלות שונות מאוד, תשובה משותפת אחת: קריאת REST שקוראת ומשנה גיליונות אלקטרוניים בענן, ללא צורך ב‑Excel מותקן בשום מקום.

בעיות תוכן של גיליון אלקטרוני מופיעות כמעט בכל קוד עם הרבה נתונים:

  • ביקורת תוכן — איתור כל תא, צורה או קישור שמזכיר שם מוצר מיושן, כתובת משרד ישנה או ישות משפטית שאינה בתוקף;
  • הצגת תבנית — מילוי אסימוני {{PLACEHOLDER}} ברחבי הגליונות לפני שליחת חוברת עבודה ללקוח;
  • קישורים שבורים — בדיקת שהכתובות המוטמעות בחוברת עבודה עדיין ניתנות לגישה, לפני שמסמכי ציות או ארכיון מאשרים זאת;
  • תיקון גורף — תיקון שגיאת הקלדה או ערך עמודה מאוית בצורה שגויה בעשרות גליונות, או המוגבל לאזור אחד של גליון אחד.

האפשרויות המסורתיות — ספריית תסריט רצה במחשב שלך, מאקרו של Excel, או רכיב COM בשרת Windows — כולן משמעותן שאתה האחראי לארח ולהגדיל את לוגיקת הגליונות. Aspose.Cells Cloud ממירה זאת ל‑REST פשוט: שלח קובץ (או רק שם קובץ), קבל התאמות — או קובץ מתוקן — בחזרה.

פוסט זה מציג את ה‑APIs שנחשפים על ידי ה‑SearchController המרכזי במיקרו‑שירות Aspose.Cells Cloud (מקור: src/Aspose.Cells.Cloud.MicroService/Controllers/SearchController.cs), עם דוגמאות שניתן להריץ ב‑cURL ו‑C# (.NET), בנוסף להערות למשתמשי Python ו‑Java.

1. מה יכול SearchController לעשות?

SearchController מכסה שלוש משפחות של יכולות, כל אחת זמינה בכמה תחומים:

משפחה מה הוא עושה משנה את חוברת העבודה?
חיפוש מחזיר את פריטי הטקסט המתאימים לשאילתה — עם גיליון ומיקום התא/הצורה/הקישור לא
החלפה מחליף את הטקסט המתאים, ואז או משדר קובץ מתוקן חזרה או שומר אותו באחסון ענן כן
קישורים שבורים מאמת כל קישור http(s) בחוברת העבודה ומחזיר את אלו שלא מצליחים להיפתר לא

וכל משפחה נחשפת בארבעה תחומים, וזה המקום שבו רשימת נקודות הקצה מתארכת:

תחום חיפוש החלפה קישורים שבורים
קובץ מקומי → עיבוד מקוון (העלאה בגוף הבקשה) PUT /v4.0/cells/search/content PUT /v4.0/cells/replace/content PUT /v4.0/cells/search/broken-links
חוברת עבודה שלמה באחסון ענן PUT /v4.0/cells/{name}/search/content PUT /v4.0/cells/{name}/replace/content PUT /v4.0/cells/{name}/search/broken-links
גיליון עבודה יחיד באחסון ענן 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
טווח יחיד באחסון ענן 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 — אפילו החיפושים לקריאה בלבד — מכיוון שחיפוש מודל כ_פעולה שמוגשת נגד משאב_, ולא GET שניתן לשמור במטמון.

שני מצבי הפעולה ולמה הם חשובים

הבקר מקשט כל פעולה, והקישוט מודיע לך בדיוק מאיפה הקובץ מגיע:

  • [OnlineOperation] — ללא‑מצב. אתה מעלה את חוברת העבודה בגוף הבקשה (multipart), השרת מעבד אותה בזיכרון, ואין שום דבר שנשמר באחסון בענן. מושלם עבור “פשוט תגיד לי מה יש בקובץ הזה” ולתבנית חד‑פעמית.
  • [CloudFileOperation] — מבוסס‑אחסון. השרת מושך את {name} מאחסון בענן (אופציונלי תחת folder=), מבצע את העבודה, ו— עבור פעולות ההחלפה — כותב את התוצאה חזרה ישירות. שום דבר לא מועבר למחשב שלך.

ההבדל היחיד הזה, יחד עם מקטעי הנתיב {worksheet} / {cellArea}, הוא המודל המנטלי כולו. שאר הפוסט הזה הוא רק הפרטים.

[The content was not provided, so no translation could be performed.]

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:, וזה האופן שבו רשימה שטוחה אחת יכולה לומר לך איזה סוג של פריט תואם. התג הזה הוא ההבדל בין “fix cell B7” ל-“fix the text box sitting over B7”.

  2. שני המודלים מתארים את עצמם לדיווח — Filename ו-Worksheet מוחזרים בכל פריט, כך שסריקה של מספר רב של חוברות עבודה יכולה להיות משולבת בטבלה אחת של ביקורת ללא עיבוד נוסף.

3. שני דברים שאתה צריך לפני שאתה מתחיל

  1. הירשם לחשבון חינמי ב-Aspose Cloud Dashboard וצור יישום כדי לקבל Client ID ו-Client Secret (ה‑SDKs מחליפים את אלה ב‑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: חיפוש קובץ מקומי באינטרנט (לא נשמר)

זהו 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 (הגדרת אזור/מיקום) — אותם פרמטרים אופציונליים שתראו במגוון גרסאות האחסון בענן בשם 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: חיפוש קובץ שכבר נמצא באחסון ענן

כאשר חוברת העבודה כבר נמצאת באחסון הענן של Aspose, דלג על ההורדה לחלוטין — השירות קורא אותה במקום שבו היא נמצאת:

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

למה שלושה נקודות קצה במקום אחת? כי הנתיב נושא את ההקשר. נקודת הקצה של כל חוברת העבודה מקבלת שם ושאילתה; נקודת הקצה של הגיליון מקבלת מקטע של גיליון; נקודת הקצה של הטווח מקבלת גיליון ו מקטע טווח. זהו מבנה REST נקי, ניתן למטמון — וזה אומר שהפרמטרים “הצמצם את החיפוש שלי” (worksheet, cellArea) קיימים רק בנקודת הקצה של הקובץ המקומי, מה שכדאי לזכור כשאתה מעביר קריאה מהקשר אחד לאחר.

6. תרחיש C: קבל כל פריט טקסט ב‑מחברת

לעיתים אין לך מונח חיפוש — אתה רוצה את המלאי. נקודות הקצה all-textitems מחזירות כל פריט טקסט בגיליון העבודה, כך שתוכל לבצע diff של שני גרסאות, לבנות מילון מונחים לתרגום, או להזין אינדקסר:

# 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 מתמלא עבור כל מחרוזת תא, כיתוב קישור וטקסט צורה בקובץ. זהו הפרימיטיב “grep the whole workbook”.

7. תסריט D: החלפה — ושתי תוצאות שונות מאוד

Replace הוא המקום שבו ה-API מתפצל לשניים, והפיצול הוא מכוון:

העלאה מקומית → הורדת הקובץ המתוקן קובץ בענן → נשמר חזרה באחסון
נקודת קצה 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 — כך שניתן להציג מצייני מיקום בגיליון אחד מבלי לגעת בשאר התבנית.

② החלפה בחוברת עבודה בענן, שמירה במקום

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

החלפה במקום היא הרסנית במטרה. גרסאות הענן מחליפות את {name} — אין יצירת עותק גיבוי. עבור זרימות עבודה עם ביקורת גבוהה, שמרו עותק מתועד (למשל העלו תחילה את Book1-2026-09-11.xlsx, ואז החליפו) או השתמשו בגרסת העלאה מקומית ושמרו את הזרם שהוחזר בעצמכם.

8. תסריט E: מצא קישורים שבורים לפני שמישהו אחר עושה זאת

בדיקת קישורים היא הפונקציה הנסתרת כאן — זה הסוג של דבר שמייגע לכתוב בעצמך ומביך לדלג עליו. כל ארבעת הטווחים זמינים; גרסת הקובץ המקומי היא הבדיקה המהירה ביותר.

# 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. תא שמחזיק מספר, תאריך או בוליאני מדולג — ולכן חיפוש של 2025 לא יתאים לתא שמורכב כתאריך שערכו הסידורי הוא 2025. תאים שהנוסחאות שלהם מחזירות טקסט מתאימים, מכיוון שסוג הערך שלהם הוא מחרוזת.

רגישות לאותיות היא אפשרות ההתאמה היחידה. ignoringCase מחליף בין InvariantCultureIgnoreCase ל-InvariantCulture — ולא יותר. אין מצב של התאמה של מילה שלמה, regex, או “התאם ערך תא שלם”, למרות מה שה‑API שנוצר עשוי לרמוז. אם אתה צריך את המשמעות הזו, שלוף את המלאי all-textitems וסנן אותו בצד שלך.

החלפה היא פשוטה, רגישה למקרה, החלפה מילולית. הדגל ignoringCase של Search אין לו מקבילה ב-Replace — לנתיב ההחלפה אין כלל פרמטר של חוסר רגישות למקרה. והנתיבים הקודיים השניים שונים פנימית: החלפה של כל הגיליון מעבירה את המשימה למנוע Worksheet.Replace(...), בעוד שהחלפה בטווח עוברת על הטווח ומשנה כל תא מחרוזת באמצעות cell.StringValue.Replace(...). תוצאה מעשית: החלפה בטווח משפיעה רק על תאי מחרוזת, והיא מילולית, ולא מבוססת תבנית.

קישורים תואמים מדווחים על הכתובת, לא על הכיתוב. כאשר חיפוש תואם ל_טקסט התצוגה_ של קישור, ה-Content המוחזר הוא עדיין hyperlink.Address. אם אתה יוצר דוח “נמצא כאן”, צפה בכתובת ה‑URL — הכיתוב אינו מוחזר.

בדיקת קישורים שבורים מתמקדת רק ב-http:// ו-https://. mailto: קישורים, נתיבי קבצים מקומיים, ועוגנים פנימיים #Sheet1!A1 מדולגים לחלוטין — הם אף פעם לא נבדקים, ולכן לעולם לא יופיעו בתוצאות. היא גם סורקת קישורים היפר-טקסט המצורפים לצורות וכן לתאים, שזה בדיוק המקום שבו קישורים שבורים נוטים להסתתר. שים לב ש-Position של קישור שבור נבנה מה-hyperlink.Area הגולמי (ולא מה-Area.ToRangName() הידידותי יותר שבו משתמשים קצות החיפוש), ולכן אל תניח שהשתי משפחות מציגות מיקומים זהים — נתח את הצמד Worksheet + LinkAddress אם אתה צריך מפתח יציב.

“Broken” משמעותו “לא ניתן להגיע”, ולא “קוד סטטוס שגוי”. הבדיקה משגרת בקשת HTTP HEAD לכל קישור ומתייחסת לכל תגובה — כולל 404 או 500 — כזמינה; היא מסמנת קישור כ‑broken רק כאשר הבקשה זורקת (כשל DNS, חיבור נדחה, שגיאת TLS, פקיעת זמן). לכן יש להתייחס לפלט כ‑“קישורים שלא ניתן ליצור איתם קשר”. אם מה שאתה באמת צריך הוא “קישורים שלא מחזירים 2xx”, תרצה לבדוק מחדש את ערכי LinkAddress שהוחזרו בעצמך.

cellArea מתקבל אך לא מוחל בקצות הקישורים הפגומים. מימוש BrokenLinks מסנן רק לפי שם הגיליון; ארגומנט ה‑cell‑area מועבר אך אף פעם אינו משמש. בפועל, משמעות הדבר היא ש‑.../ranges/A1:F40/search/broken-links מתנהג כיום זהה ל‑/worksheet/search/broken-links עבור אותו גיליון — הקישורים מתוקנים על פני כל הגיליון. הגדר את ה‑reports שלך בהתאם (או סנן את הרשימה שהוחזרה לפי מיקום) במקום להניח שהטווח מצמצם את הבדיקה.

אף אחד מאלה אינו חוסם — הם ההבדל בין תכונה ש"works in the demo" לבין תכונה שמתנהגת באופן צפוי בייצור.

10. טיפול בשגיאות והערות תפעוליות

החוזה שהבקר מתעד

Status Meaning Typical cause
400 בקשה שגויה כתובת URL/פרמטרים לא תקינים — למשל cellArea פגום, או searchText חסר
401 לא מורשה אימות נכשל או שלא סופקו אישורים תקינים
404 לא נמצא קובץ המקור אינו נגיש באחסון בענן
500 שגיאת שרת השירות נתקל באנומליה בעת קבלת נתוני הגיליון

בפנים, כל פעולה עוטפת את העבודה שלה בעזרית (WorkbookElementOperation, UpdateWorkbookElementOperation, UpdateWorkbookElementOperationAndSave) שתופסת כישלונות ומחזירה אותן מחדש כ‑CellsApiException עם קידומת שם הפעולה — לדוגמה SearchContentInRemoteRange Error Message: .... שם הפעולה הזה הוא המחרוזת שתראו ביומני הרישום שלכם:

שם הפעולה משפחת נקודת קצה
SearchSpreadsheetContent, SearchContentInRemoteSpreadsheet חיפוש מקומי / מרוחק
SearchContentInRemoteWorksheet, SearchContentInRemoteRange חיפוש מרוחק מוגדר
ReplaceSpreadsheetContent החלפה מקומית (תוצאה זורמת)
ReplaceContentInRemoteSpreadsheet, ReplaceContentInRemoteWorksheet, ReplaceContentInRemoteRange החלפה מרוחקת (שומרת תוצאה)
SearchSpreadsheetBrokenLinks, SearchBrokenLinksInRemoteSpreadsheet, SearchBrokenLinksInRemoteWorksheet, SearchBrokenLinksInRemoteRange אימות קישורים

פרמטרים אופציונליים שה‑SDKs חושפים

מעבר לפרמטרים המתועדים, מודלי הבקשות של אחסון בענן כוללים את שלושת ההגדרות האופציונליות זהות:

  • password — פתח חוברת עבודה מוגנת בסיסמה (החיפושים אינם דורשים גישה לכתיבה, ולכן קבצים המוגנים לקריאה פועלים כראוי);
  • storageName — הפנה לאחסון ענן מותאם/מצורף במקום ברירת המחדל (Python: storage_name);
  • regoin — הגדרת האזור/המיקום המשמשת בעת פירוש חוברת העבודה (Python כותב זאת region).

אימות

כל ערכות הפיתוח מתאימות באופן אוטומטי עם OAuth 2.0 client_credentials ו‑JWT; כאשר משתמשים ב‑cURL גולמי, יש לקרוא ל‑/connect/token פעם אחת תחילה (ראה §4, ①).

11. למה Aspose.Cells Cloud לחיפוש והחלפה?

  • ✅ אפס תלות מקומית — ללא Office/Excel, ללא COM, ללא מארח סקריפטים. ניתן לקריאה מכל שפה, מכל פלטפורמה (Linux, מכולות, ללא שרת);
  • ✅ עמוק יותר מחיפוש טקסט — תאים, צורות וקישורים הם כולם יעדי התאמה ברמת ראשונה, שזה בדיוק המקום שבו גיליונות אלקטרוניים אמיתיים שומרים את התוכן שלהם;
  • ✅ פעולות ממוקדות — חוברת עבודה / גיליון עבודה / טווח, כך שאתה יכול לתקן אזור אחד של גיליון אחד מבלי לשכתב קובץ של 50 MB;
  • ✅ ענן‑מקורי או חסר מצב — קבצים שכבר באחסון לעולם לא עוזבים אותו; פעולות העלאה מקומית אינן משמרות דבר;
  • ✅ כתיבה ברמת דיוק גבוהה — החלפות מתבצעות דרך מנוע Aspose.Cells וממוחזרות, כך שנוסחאות, סגנונות, תרשימים ועיצוב שורדים את המסלול חזרה;
  • ✅ צורה אחת בכל ה‑SDKs — הממשקים של cURL, .NET, Python ו‑Java ממופים 1:1, כך שהדפוס שאתה מעתיק משפה אחת עובד באחרות.

התחל עכשיו: הירשם ל‑Aspose Cloud Dashboard, צור יישום, שים את האישורים שלך באחד הקטעים שלמעלה, והפנה אותו לאחת מחוברות העבודה שלך — יהיה לך ביקורת תוכן עובדת בתוך דקות.

האם מצאת זאת שימושי? תן כוכב, סימון או שתף זאת — ותגיד לנו בתגובות למה אתה משתמש בחיפוש והחלפה בגיליון העבודה.