Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
SaveFormat.Ofd enumeration value. The resulting OFD document preserves the workbook’s visible layout, content, merged cells, column widths, row heights, fonts, colors, borders, and number formats. This makes Aspose.Cells for Python via Java suitable for archival, printing, regulatory filing, and government submission workflows that require a fixed-layout output.
OFD (Open Fixed-layout Document) is a Chinese national standard (GB/T 33190-2016) for representing digital documents in a fixed, page-based layout. It serves a role similar to PDF for use cases where the visual appearance of the source document must be preserved exactly as authored. OFD is widely adopted for government submissions, regulatory filings, electronic invoices, and long-term archival in the People’s Republic of China.
Converting Excel workbooks to OFD is a common requirement in scenarios where spreadsheet content must be distributed as a read-only, layout-locked artifact rather than as an editable spreadsheet. Examples include shipping a finalized invoice to a customer, archiving a quarterly financial report, or submitting a budget spreadsheet to a regulatory authority. Aspose.Cells for Python via Java addresses this requirement through the SaveFormat.Ofd enumeration value, which writes the workbook directly to OFD without requiring an intermediate conversion step. The OFD output preserves cell values, merged ranges, fonts, colors, borders, number formats, and page setup options configured on the workbook.
The OFD output generated by Aspose.Cells for Python via Java preserves the visible layout of the source workbook, including cell content, merged cells, column widths, and row heights. Cell formatting such as fonts, colors, borders, alignment, and number formats are also rendered in the fixed-layout output. Page setup options configured on the worksheet, such as paper size, orientation, and print area, influence the layout of the resulting OFD document.
Aspose.Cells for Python via Java allows you to build a workbook programmatically, populate it with data, and then save it directly to OFD format using the SaveFormat.Ofd enumeration. The following example creates an invoice from scratch. It adds a company logo, header information, a bill-to section, line items, and calculated totals, then exports the workbook to an OFD document.
The example constructs an invoice worksheet by inserting a logo image into the top-left area, populating the company name and contact details, adding an “INVOICE” title across merged cells, recording the invoice number and date, listing the bill-to client, building a line items table with description, quantity, unit price, and total columns, and computing the subtotal, tax, and grand total using cell formulas. Formatting such as bold headers, currency format for prices, borders, and column widths is applied using Style and Font objects. Finally, the workbook is saved with the .ofd extension using SaveFormat.Ofd.
import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat, Style, Cell, TextAlignmentType, BorderType, CellBorderType, Color
dataDir = "/tmp/"
# Create a new Workbook
workbook = Workbook()
# Obtain the first worksheet
worksheet = workbook.getWorksheets().get(0)
# Set column widths
worksheet.getCells().setColumnWidth(0, 5)
worksheet.getCells().setColumnWidth(1, 35)
worksheet.getCells().setColumnWidth(2, 12)
worksheet.getCells().setColumnWidth(3, 15)
worksheet.getCells().setColumnWidth(4, 15)
worksheet.getCells().setColumnWidth(5, 5)
# Insert company logo
worksheet.getPictures().add(1, 1, dataDir + "logo.png")
# Company name and contact details
worksheet.getCells().get("B3").putValue("Acme Corporation")
worksheet.getCells().get("B4").putValue("123 Business Street")
worksheet.getCells().get("B5").putValue("City, State 12345")
worksheet.getCells().get("B6").putValue("Phone: (555) 123-4567")
# INVOICE title - merge cells
worksheet.getCells().merge(7, 1, 2, 4)
titleCell = worksheet.getCells().get("B8")
titleCell.putValue("INVOICE")
titleStyle = workbook.createStyle()
titleStyle.getFont().setBold(True)
titleStyle.getFont().setSize(20)
titleStyle.setHorizontalAlignment(TextAlignmentType.CENTER)
titleCell.setStyle(titleStyle)
# Invoice number and date
worksheet.getCells().get("B11").putValue("Invoice Number:")
worksheet.getCells().get("C11").putValue("INV-2024-001")
worksheet.getCells().get("B12").putValue("Date:")
worksheet.getCells().get("C12").putValue(datetime.datetime.now().strftime("%Y-%m-%d"))
# Bill-to section
worksheet.getCells().get("B14").putValue("Bill To:")
worksheet.getCells().get("B15").putValue("Client Name")
worksheet.getCells().get("B16").putValue("Client Address")
worksheet.getCells().get("B17").putValue("Client City, State")
# Line items header
headerDesc = worksheet.getCells().get("B19")
headerQty = worksheet.getCells().get("C19")
headerPrice = worksheet.getCells().get("D19")
headerTotal = worksheet.getCells().get("E19")
headerDesc.putValue("Description")
headerQty.putValue("Quantity")
headerPrice.putValue("Unit Price")
headerTotal.putValue("Total")
headerStyle = workbook.createStyle()
headerStyle.getFont().setBold(True)
headerStyle.getFont().setColor(Color.getWhite())
headerStyle.setBackgroundColor(Color.getNavy())
headerStyle.setHorizontalAlignment(TextAlignmentType.CENTER)
headerStyle.getBorders().get(BorderType.TOP_BORDER).setLineStyle(CellBorderType.THIN)
headerStyle.getBorders().get(BorderType.BOTTOM_BORDER).setLineStyle(CellBorderType.THIN)
headerStyle.getBorders().get(BorderType.LEFT_BORDER).setLineStyle(CellBorderType.THIN)
headerStyle.getBorders().get(BorderType.RIGHT_BORDER).setLineStyle(CellBorderType.THIN)
headerDesc.setStyle(headerStyle)
headerQty.setStyle(headerStyle)
headerPrice.setStyle(headerStyle)
headerTotal.setStyle(headerStyle)
# Currency style with borders
currencyStyle = workbook.createStyle()
currencyStyle.setCustom("\"$\"#,##0.00")
currencyStyle.getBorders().get(BorderType.TOP_BORDER).setLineStyle(CellBorderType.THIN)
currencyStyle.getBorders().get(BorderType.BOTTOM_BORDER).setLineStyle(CellBorderType.THIN)
currencyStyle.getBorders().get(BorderType.LEFT_BORDER).setLineStyle(CellBorderType.THIN)
currencyStyle.getBorders().get(BorderType.RIGHT_BORDER).setLineStyle(CellBorderType.THIN)
# Plain border style for description/quantity cells
borderStyle = workbook.createStyle()
borderStyle.getBorders().get(BorderType.TOP_BORDER).setLineStyle(CellBorderType.THIN)
borderStyle.getBorders().get(BorderType.BOTTOM_BORDER).setLineStyle(CellBorderType.THIN)
borderStyle.getBorders().get(BorderType.LEFT_BORDER).setLineStyle(CellBorderType.THIN)
borderStyle.getBorders().get(BorderType.RIGHT_BORDER).setLineStyle(CellBorderType.THIN)
# Line items rows
lineItems = [
["Product A - Widget", 2, 50.00],
["Product B - Gadget", 3, 75.00],
["Product C - Service", 1, 100.00]
]
for i in range(len(lineItems)):
row = 20 + i
descCell = worksheet.getCells().get(row, 1)
qtyCell = worksheet.getCells().get(row, 2)
priceCell = worksheet.getCells().get(row, 3)
totalCell = worksheet.getCells().get(row, 4)
descCell.putValue(lineItems[i][0])
qtyCell.putValue(lineItems[i][1])
priceCell.putValue(lineItems[i][2])
totalCell.setFormula("C" + str(row) + "*D" + str(row))
descCell.setStyle(borderStyle)
qtyCell.setStyle(borderStyle)
priceCell.setStyle(currencyStyle)
totalCell.setStyle(currencyStyle)
# Subtotal, tax, grand total
worksheet.getCells().get("B24").putValue("Subtotal:")
subtotalCell = worksheet.getCells().get("E24")
subtotalCell.setFormula("SUM(E20:E22)")
worksheet.getCells().get("B25").putValue("Tax (10%):")
taxCell = worksheet.getCells().get("E25")
taxCell.setFormula("E24*0.1")
worksheet.getCells().get("B26").putValue("Grand Total:")
grandTotalCell = worksheet.getCells().get("E26")
grandTotalCell.setFormula("E24+E25")
# Bold + currency style for total values
totalStyle = workbook.createStyle()
totalStyle.getFont().setBold(True)
totalStyle.setCustom("\"$\"#,##0.00")
subtotalCell.setStyle(totalStyle)
taxCell.setStyle(totalStyle)
grandTotalCell.setStyle(totalStyle)
# Bold style for total labels
boldStyle = workbook.createStyle()
boldStyle.getFont().setBold(True)
worksheet.getCells().get("B24").setStyle(boldStyle)
worksheet.getCells().get("B25").setStyle(boldStyle)
worksheet.getCells().get("B26").setStyle(boldStyle)
# Save the workbook as an OFD file
workbook.save(dataDir + "Invoice.ofd", SaveFormat.Ofd)
jpype.shutdownJVM()
Aspose.Cells for Python via Java can also load an existing Excel workbook from disk and export it directly to OFD format. This is useful for batch conversion pipelines, archival workflows, and scenarios where the source workbook was produced by another tool and only needs to be re-emitted as a fixed-layout artifact. The following example loads an existing .xlsx workbook, reads data from its cells, applies optional page setup adjustments, and saves the result as an OFD document.
from datetime import datetime
jpype.startJVM()
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat, PageOrientationType, PaperSizeType, CellsHelper
dataDir = "C:\\Examples\\"
# Open an existing Excel workbook from disk
workbook = Workbook(dataDir + "SampleBook.xlsx")
# (1) Read and display values from selected cells to confirm the file was loaded
firstSheet = workbook.getWorksheets().get(0)
print("First sheet name: " + firstSheet.getName())
print("Cell A1: " + firstSheet.getCells().get("A1").getStringValue())
print("Cell B1: " + firstSheet.getCells().get("B1").getStringValue())
print("Cell C1: " + firstSheet.getCells().get("C1").getStringValue())
# (2) Iterate over the Worksheets collection to enumerate available sheets
print("\nAvailable worksheets:")
for i in range(workbook.getWorksheets().getCount()):
ws = workbook.getWorksheets().get(i)
print(" [" + str(i) + "] " + ws.getName())
# (3) Optionally update a timestamp cell to reflect the conversion
firstSheet.getCells().get("A1").putValue("Converted on: " + datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# Append a summary header row at the top of the data block
firstSheet.getCells().insertRow(0)
firstSheet.getCells().get("A1").putValue("Conversion Summary")
firstSheet.getCells().get("A2").putValue("Generated: " + datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# (4) Configure PageSetup properties on the worksheet
pageSetup = firstSheet.getPageSetup()
pageSetup.setOrientation(PageOrientationType.LANDSCAPE)
pageSetup.setPaperSize(PaperSizeType.PAPER_A_4)
pageSetup.setFitToPagesTall(1)
pageSetup.setFitToPagesWide(1)
# (5) Optionally set the print area for the OFD output
lastRow = firstSheet.getCells().getMaxDataRow()
lastCol = firstSheet.getCells().getMaxDataColumn()
lastColLetter = CellsHelper.columnIndexToName(lastCol)
printArea = "A1:" + lastColLetter + str(lastRow + 1)
firstSheet.getPageSetup().setPrintArea(printArea)
print("\nPrint area set to: " + printArea)
# (6) Save the workbook as an OFD file
workbook.save(dataDir + "SampleBook.ofd", SaveFormat.Ofd)
print("\nFile successfully converted to OFD format: " + dataDir + "SampleBook.ofd")
jpype.shutdownJVM()
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.