מאמר טכני

ייצוא CSV, TSV ו-HTML מ-HotXLS עבור Delphi

HotXLS, ספריית גיליונות אלקטרוניים נייטיבית עבור Delphi ו-C++Builder, תומכת בייצוא גיליונות לפורמטים מרובים מעבר ל-XLS ול-XLSX. ארבעת הנתיבים שמרוויחים מתשומת לב מיוחדת הם CSV, HTML, RTF, וייבוא CSV שמשנה דברים בצורה בלתי צפויה

ייצוא CSV: ציטוט RFC 4180, BOM ומפריד

SaveAsCSV כותב UTF-8 עם BOM, סיומות CRLF וציטוט RFC 4180: שדות המכילים פסיקים, גרשיים או סיומות שורה מוקפות בגרשיים כפולים, וגרשיים כפולים בתוך שדה מכופלים. המפריד ניתן לשינוי: ניתן לציין טאב עבור TSV. מלכודת הנוסחאות: SaveAsCSV כותב נוסחאות כטקסט מילולי, לא כערך מחושב. אם הצרכן מצפה למספרים, הפעל Calculate לפני הייצוא, או ייצא מחוברת שכבר מכילה תוצאות מחושבות

ייצוא HTML: WriteDocument, TableClass וקוד חזרה

SaveAsHTML מייצר טבלת HTML יחידה. ניתן להגדיר את TableClass כדי להוסיף class name לאלמנט <table> לצורך עיצוב CSS. מיזוגי תאים מיוצגים ב-colspan ו-rowspan. קוד החזרה חריג: בשונה מרוב קריאות HotXLS שמחזירות 1 להצלחה, SaveAsHTML מחזיר 0 להצלחה ו--1 לשגיאה. בדוק = 0, לא = 1

מגבלות ייצוא RTF

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

ייבוא CSV: פעולה הרסנית

Open עם קובץ CSV מחליף את כל תוכן הגיליון הנוכחי בנתוני ה-CSV. אם אתה פותח CSV לתוך חוברת קיימת עם נתונים, הנתונים הקיימים יאבדו ללא אזהרה. תמיד צור TXLSXWorkbook חדש לפני ייבוא CSV

Stream overloads

שתי משפחות HotXLS תומכות ב-TStream overloads לכל פעולות ה-IO הנפוצות — Open, SaveAs, SaveAsCSV, SaveAsHTML ו-SaveAsODS. זה מאפשר לעבוד ישירות עם blob storage או HTTP response ללא כתיבה לדיסק. שים לב: לאחר SaveAs(Stream) ה-stream position אינו מאופס — הגדר Stream.Position := 0 בעצמך לפני קריאה מה-stream

HotXLS קומפל לתוך אפליקציית Delphi או C++Builder ללא תלויות חיצוניות; מהדורות ורישוי זמינים בדף HotXLS Component

דוגמאות קוד נוספות

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  R: Integer;
begin
  Book := TXLSXWorkbook.Create;
  try
    Book.Open('invoice-run.xlsx');
    Sheet := Book.Sheets[0];

    // Materialize formula results so the CSV carries numbers, not '=...' text
    for R := 2 to 41 do
      if Sheet.Cells[R, 4].Formula <> '' then
        Sheet.Cells[R, 4].Value := Book.Calculate(Sheet.Cells[R, 4].Formula);

    Book.SaveAsCSV('feed.csv', 0, ',');    // sheet 0, comma
    Book.SaveAsCSV('feed.tsv', 0, #9);     // same sheet as TSV
  finally
    Book.Free;
  end;
end;
var
  Opts: TXLSXHtmlExportOptions;
begin
  Opts := TXLSXHtmlExportOptions.Create;
  try
    Opts.Title := 'Weekly settlement';
    Opts.TableClass := 'report-grid';     // hook for the host page stylesheet
    Opts.WriteDocument := True;           // full page, not a fragment
    if Book.SaveAsHTML('settlement.html', 0, Opts) <> 0 then
      raise Exception.Create('Sheet index out of range');
  finally
    Opts.Free;
  end;
end;