IP Inlay for FileMaker
← Back to blog

Native Excel Export for FileMaker with Password Protection Built In

· Gordon Shumway

Inlay_EXCEL_EXPORT brings native spreadsheet generation directly into FileMaker workflows — multi-sheet workbooks, cell-level formatting, formulas, charts, and optional AES-256 password protection.

For a long time, exporting structured Excel files from FileMaker usually meant one of three things:

  • fragile XML generation
  • external scripting layers
  • server-side helper services

That works until the workflow grows.

Formatting becomes inconsistent. Multi-sheet exports become painful. Teams start maintaining separate export pipelines outside the actual FileMaker solution.

With Inlay_EXCEL_EXPORT, Inlay can now generate native .xlsx files directly from FileMaker using a JSON-driven structure, with support for password-protected workbooks built directly into the function.

No Microsoft Office automation required.

No external spreadsheet libraries to license separately.

No additional plugins.

The capability is included directly with Inlay.

The Function

At its core, the function accepts a JSON payload describing the workbook structure, sheets, rows, formatting, output behavior, and optional workbook password.

FILEMAKER
Inlay_EXCEL_EXPORT (
    JSONSetElement ( "{}" ;
        [ "_inlay"     ; True ; JSONBoolean ] ;
        [ "outputPath" ; "/Users/shared/report.xlsx" ; JSONString ] ;
        [ "password"   ; "super-secret-password" ; JSONString ] ;
        [ "sheets[0].name"        ; "Users" ; JSONString ] ;
        [ "sheets[0].rows[0][0]"  ; "Name"  ; JSONString ] ;
        [ "sheets[0].rows[0][1]"  ; "Email" ; JSONString ] ;
        [ "sheets[0].rows[1][0]"  ; "Gordon Shumway" ; JSONString ] ;
        [ "sheets[0].rows[1][1]"  ; "g.shumway@melmacians.com" ; JSONString ]
    )
)

The result is a native password-protected .xlsx workbook generated directly from FileMaker.

Omit outputPath and the function returns the workbook as a FileMaker container instead. Set asContainer: true alongside outputPath to get both — a file on disk and a container in one call.

Multi-Sheet, Out of the Box

sheets is an array. Each sheet has its own name, columns, rows, freeze settings, autofilter, and charts — completely independent of every other sheet.

FILEMAKER
Inlay_EXCEL_EXPORT (
    JSONSetElement ( "{}" ;
        [ "_inlay"     ; True ; JSONBoolean ] ;
        [ "outputPath" ; "/Users/shared/Q1.xlsx" ; JSONString ] ;
        [ "sheets[0].name" ; "Summary" ; JSONString ] ;
        [ "sheets[0].rows[0][0]" ; "Q1" ; JSONString ] ;
        [ "sheets[0].rows[0][1]" ; 12000 ; JSONNumber ] ;
        [ "sheets[1].name" ; "Detail" ; JSONString ] ;
        [ "sheets[1].rows[0][0]" ; "Date" ; JSONString ] ;
        [ "sheets[1].rows[0][1]" ; "Amount" ; JSONString ] ;
        [ "sheets[1].rows[1][0]" ; "2026-04-01" ; JSONString ] ;
        [ "sheets[1].rows[1][1]" ; 423.10 ; JSONNumber ]
    )
)

Sheet names are validated against Excel's naming rules, and duplicates are rejected before a byte is written.

Cell Formatting

Two ways to format a cell. The fast path is a named token:

bold | italic | header | int | decimal2 | usd | percent | date | datetime

Or any raw Excel format code — "#,##0.00", "[Red]-0.00", etc.

JSON
{ "value": 1234.5, "format": "usd" }

For real control, pass an object:

JSON
{
  "value": "TOTAL",
  "format": {
    "bold": true,
    "fontColor": "#FFFFFF",
    "bgColor": "#1D4ED8",
    "align": "center",
    "valign": "middle",
    "border": "thin",
    "borderColor": "#0F172A"
  }
}

Supported format-object keys:

  • Type: bold, italic, strike, underline (none | single | double | singleAccounting | doubleAccounting)
  • Font: fontName, fontSize, fontColor
  • Background: bgColor
  • Alignment: align (left | center | right | justify | fill), valign (top | middle | bottom), wrap, indent, rotate (-90..90, or 270 for vertical)
  • Borders: border shorthand or per-side borderTop / borderBottom / borderLeft / borderRight, plus borderColor. Values: none | thin | medium | thick | double | hair | dashed | dotted.
  • Numbers: numberFormat — any raw Excel format code

Colors accept #RRGGBB hex or named values: red, blue, green, yellow, black, white, gray, cyan, magenta, orange, purple, pink, brown.

Formulas (with Seeded Results)

Cells can hold real Excel formulas. The value key seeds the cached result so FileMaker's container preview and other non-recalculating viewers show the right number before Excel re-evaluates the workbook:

JSON
{ "formula": "=SUM(B2:B10)", "value": 30430, "format": "usd" }

Cross-sheet references work too: =Sheet1!B2, =SUM(Detail!$B$2:$B$100).

Dates and Hyperlinks

Dates accept ISO-8601 (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS[.fff]) and apply a sensible default Excel date format unless you override it:

JSON
{ "date": "2026-04-15T09:30:00", "format": "datetime" }

Hyperlinks render as real clickable cells. Accepted forms: https://, http://, mailto:, internal:Sheet!Cell (intra-workbook), and external file paths:

JSON
{ "link": "https://pinethree.dev", "text": "Pine Three", "format": "bold" }

Column Widths, Freeze Panes, Autofilter

Per-sheet structural keys:

JSON
{
  "columns":    [ { "width": 18 }, { "width": 14, "format": "usd" } ],
  "freeze":     { "row": 1, "col": 0 },
  "autofilter": [ [0, 0], [0, 4] ]
}

Column-level formats apply to every cell in the column unless a specific cell overrides them. autofilter takes two [row, col] pairs marking the corners of the filter range.

Charts

Each sheet can hold any number of charts. Types: column, line, bar, pie, scatter, area.

JSON
{
  "charts": [
    {
      "type": "column",
      "title": "Quarterly revenue",
      "position": { "row": 1, "col": 4 },
      "size":     { "width": 480, "height": 320 },
      "legend":   { "position": "bottom" },
      "x_axis":   { "name": "Quarter" },
      "y_axis":   { "name": "USD" },
      "series": [
        { "name": "2025", "categories": "=Sheet1!$A$2:$A$5", "values": "=Sheet1!$B$2:$B$5" },
        { "name": "2026", "categories": "=Sheet1!$A$2:$A$5", "values": "=Sheet1!$C$2:$C$5" }
      ]
    }
  ]
}

series.values is required; categories, title, axes, and legend are optional. offset and scale are available for pixel-perfect placement inside the anchor cell.

Why Password-Protected Excel Matters

In many organizations, Excel files are not just exports.

They become operational deliverables.

That means spreadsheets often contain:

  • payroll information
  • financial reporting
  • production schedules
  • client data
  • contact lists
  • operational forecasts
  • internal planning documents

Traditionally, protecting those files usually meant:

  • manually opening Excel afterward
  • applying passwords by hand
  • building custom Office automation workflows
  • purchasing third-party spreadsheet SDKs

Inlay_EXCEL_EXPORT moves that entire workflow directly into FileMaker automation. Under the hood it's Microsoft's agile encryption — AES-256-CBC, SHA-512, 100,000 spin count, wrapped in a CFB container Excel natively recognizes.

The workbook can be generated and protected in a single scripted operation.

No Additional Licensing

A major design goal behind Inlay_EXCEL_EXPORT was reducing dependency sprawl.

Many spreadsheet-generation workflows eventually depend on:

  • Office installations
  • paid export SDKs
  • Java runtimes
  • Python environments
  • platform-specific automation

With Inlay, native Excel generation, formatting, charts, and workbook password protection are all included directly in the plugin itself.

No separate licensing. No Excel dependency. No external spreadsheet engine.

Just native .xlsx generation directly from FileMaker.

Real-World Use Cases

Financial Reports

Generate password-protected accounting exports with formulas and totals, directly from FileMaker scripts before sending them externally.

HR Workflows

Export employee rosters, compensation summaries, or onboarding packets into protected spreadsheets — with header rows, frozen panes, and currency formatting applied automatically.

Client Deliverables

Automatically generate protected project reports with multi-sheet detail, summary charts, and per-cell formatting during delivery workflows.

Secure Operational Handoffs

Create spreadsheets that can safely move across email, cloud storage, or shared environments while still maintaining workbook-level protection.

JSON-Driven Workbook Generation

One of the more important architectural choices behind Inlay_EXCEL_EXPORT is the JSON-driven structure.

That means workbook generation can be:

  • dynamically scripted
  • generated from loops
  • assembled from query results
  • customized per user
  • reused across solutions

FileMaker developers can stay entirely inside the native scripting environment without introducing external helper layers.

Every structural slot — sheets, rows, columns, autofilter, freeze, charts, series — accepts either real JSON or a JSON string. That means naive JSONSetElement(... ; "sheets" ; "[...]" ; JSONString) chains work without any pre-parsing dance; the function unwraps the strings for you.

Keeping the Workflow Native

A recurring theme behind Inlay is reducing dependency on external glue code.

A lot of FileMaker systems slowly accumulate sidecar tooling just to bridge modern infrastructure requirements.

Spreadsheet generation is one of the most common examples.

Inlay_EXCEL_EXPORT brings that capability back into FileMaker itself — including multi-sheet output, formatting, formulas, charts, and password protection — without introducing additional licensing or deployment complexity.

No Office automation.

No helper services.

No external SDK contracts.

Just native .xlsx generation directly from FileMaker.

That is Inlay_EXCEL_EXPORT, available in Inlay 0.2.14.

Have questions about this or an idea for Inlay?

Get in touch →