Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
SaveFormat.Ofd. Сформированный документ OFD сохраняет видимую разметку рабочей книги, содержимое, объединенные ячейки, ширину столбцов, высоту строк, шрифты, цвета, границы и числовые форматы. Благодаря этому Aspose.Cells подходит для процессов архивирования, печати, представления отчетности в регулирующие органы и передачи документов в государственные органы, требующих вывода с фиксированной разметкой.
OFD (Open Fixed-layout Document) — китайский национальный стандарт (GB/T 33190-2016) для представления цифровых документов в фиксированной постраничной разметке. Он выполняет роль, аналогичную PDF, в сценариях, где внешний вид исходного документа должен быть сохранен в точности таким, каким он был создан. OFD широко используется для передачи документов в государственные органы, представления отчетности в регулирующие органы, электронных счетов и долгосрочного архивирования в Китайской Народной Республике.
Преобразование рабочих книг Excel в OFD часто требуется в сценариях, где содержимое электронной таблицы должно предоставляться как доступный только для чтения артефакт с зафиксированной разметкой, а не как редактируемая электронная таблица. Примеры включают отправку окончательного счета клиенту, архивирование ежеквартального финансового отчета или представление бюджетной таблицы в регулирующий орган. Aspose.Cells решает эту задачу с помощью значения перечисления SaveFormat.Ofd, которое записывает рабочую книгу непосредственно в OFD без промежуточного этапа преобразования. В выводе OFD сохраняются значения ячеек, объединенные диапазоны, шрифты, цвета, границы, числовые форматы и параметры настройки страницы, заданные для рабочей книги.
Aspose.Cells позволяет программно создать рабочую книгу, заполнить ее данными, а затем сохранить непосредственно в формате OFD с помощью перечисления SaveFormat.Ofd. В следующем примере счет создается с нуля. В него добавляются логотип компании, сведения заголовка, раздел с данными получателя, позиции счета и рассчитанные итоги, после чего рабочая книга экспортируется в документ OFD.
Пример создает лист счета путем вставки изображения логотипа в левую верхнюю область, заполнения названия компании и контактных данных, добавления заголовка счета в объединенных ячейках, указания номера и даты счета, перечисления клиента в разделе с данными получателя, создания таблицы позиций со столбцами описания, количества, цены за единицу и итоговой суммы, а также вычисления промежуточного итога, налога и общей суммы с помощью формул в ячейках. Форматирование, например полужирные заголовки, валютный формат цен, границы и ширины столбцов, применяется с помощью объектов Style и Font. Наконец рабочая книга сохраняется с расширением .ofd с помощью SaveFormat.Ofd.
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example</h1>
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, Color } = AsposeCells;
const readyPromise = AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: ["arial.ttf", "NotoSansSC-Regular.ttf"]
}).then(() => {
console.log("Aspose.Cells initialized");
});
document.getElementById('runExample').addEventListener('click', async () => {
try {
// Создать новую книгу
const workbook = new Workbook();
// Получить первый лист
const worksheet = workbook.worksheets.get(0);
const cells = worksheet.cells;
// Установить ширину столбцов
cells.setColumnWidth(0, 5);
cells.setColumnWidth(1, 35);
cells.setColumnWidth(2, 12);
cells.setColumnWidth(3, 15);
cells.setColumnWidth(4, 15);
cells.setColumnWidth(5, 5);
// Вставить логотип компании
// Создать PNG в памяти, поскольку браузер не имеет пути к файловой системе.
const logoCanvas = document.createElement("canvas");
logoCanvas.width = 100;
logoCanvas.height = 30;
const logoContext = logoCanvas.getContext("2d");
logoContext.fillStyle = "#000080";
logoContext.fillRect(0, 0, logoCanvas.width, logoCanvas.height);
logoContext.fillStyle = "#FFFFFF";
logoContext.font = "bold 18px Arial";
logoContext.fillText("ACME", 16, 21);
const logoBlob = await new Promise(resolve => logoCanvas.toBlob(resolve, "image/png"));
if (!logoBlob) {
throw new Error("Unable to create the company logo.");
}
const logoData = new Uint8Array(await logoBlob.arrayBuffer());
worksheet.pictures.add(1, 1, logoData);
// Название компании и контактные данные
cells.get("B3").value = "Acme Corporation";
cells.get("B4").value = "123 Business Street";
cells.get("B5").value = "City, State 12345";
cells.get("B6").value = "Phone: (555) 123-4567";
// Заголовок «СЧЕТ» — объединить ячейки
cells.merge(7, 1, 2, 4);
const titleCell = cells.get("B8");
titleCell.value = "INVOICE";
const titleStyle = workbook.createStyle();
titleStyle.font.isBold = true;
titleStyle.font.size = 20;
titleStyle.horizontalAlignment = AsposeCells.TextAlignmentType.Center;
titleCell.style = titleStyle;
// Номер счета и дата
cells.get("B11").value = "Invoice Number:";
cells.get("C11").value = "INV-2024-001";
cells.get("B12").value = "Date:";
const now = new Date();
const invoiceDate = [
now.getFullYear(),
String(now.getMonth() + 1).padStart(2, "0"),
String(now.getDate()).padStart(2, "0")
].join("-");
cells.get("C12").value = invoiceDate;
// Раздел «Кому выставить счет»
cells.get("B14").value = "Bill To:";
cells.get("B15").value = "Client Name";
cells.get("B16").value = "Client Address";
cells.get("B17").value = "Client City, State";
// Заголовок таблицы позиций
const headerDesc = cells.get("B19");
const headerQty = cells.get("C19");
const headerPrice = cells.get("D19");
const headerTotal = cells.get("E19");
headerDesc.value = "Description";
headerQty.value = "Quantity";
headerPrice.value = "Unit Price";
headerTotal.value = "Total";
const headerStyle = workbook.createStyle();
headerStyle.font.isBold = true;
headerStyle.font.color = Color.fromArgb(255, 255, 255);
headerStyle.foregroundColor = Color.fromArgb(0, 0, 128);
headerStyle.pattern = AsposeCells.BackgroundType.Solid;
headerStyle.horizontalAlignment = AsposeCells.TextAlignmentType.Center;
headerStyle.borders.get(AsposeCells.BorderType.TopBorder).lineStyle = AsposeCells.CellBorderType.Thin;
headerStyle.borders.get(AsposeCells.BorderType.BottomBorder).lineStyle = AsposeCells.CellBorderType.Thin;
headerStyle.borders.get(AsposeCells.BorderType.LeftBorder).lineStyle = AsposeCells.CellBorderType.Thin;
headerStyle.borders.get(AsposeCells.BorderType.RightBorder).lineStyle = AsposeCells.CellBorderType.Thin;
headerDesc.style = headerStyle;
headerQty.style = headerStyle;
headerPrice.style = headerStyle;
headerTotal.style = headerStyle;
// Стиль валюты с границами
const currencyStyle = workbook.createStyle();
currencyStyle.custom = '"$"#,##0.00';
currencyStyle.borders.get(AsposeCells.BorderType.TopBorder).lineStyle = AsposeCells.CellBorderType.Thin;
currencyStyle.borders.get(AsposeCells.BorderType.BottomBorder).lineStyle = AsposeCells.CellBorderType.Thin;
currencyStyle.borders.get(AsposeCells.BorderType.LeftBorder).lineStyle = AsposeCells.CellBorderType.Thin;
currencyStyle.borders.get(AsposeCells.BorderType.RightBorder).lineStyle = AsposeCells.CellBorderType.Thin;
// Обычный стиль границ для ячеек с описанием и количеством
const borderStyle = workbook.createStyle();
borderStyle.borders.get(AsposeCells.BorderType.TopBorder).lineStyle = AsposeCells.CellBorderType.Thin;
borderStyle.borders.get(AsposeCells.BorderType.BottomBorder).lineStyle = AsposeCells.CellBorderType.Thin;
borderStyle.borders.get(AsposeCells.BorderType.LeftBorder).lineStyle = AsposeCells.CellBorderType.Thin;
borderStyle.borders.get(AsposeCells.BorderType.RightBorder).lineStyle = AsposeCells.CellBorderType.Thin;
// Строки позиций
const lineItems = [
["Product A - Widget", 2, 50.00],
["Product B - Gadget", 3, 75.00],
["Product C - Service", 1, 100.00]
];
for (let i = 0; i < lineItems.length; i++) {
const row = 20 + i;
const descCell = cells.get(row, 1);
const qtyCell = cells.get(row, 2);
const priceCell = cells.get(row, 3);
const totalCell = cells.get(row, 4);
descCell.value = lineItems[i][0];
qtyCell.value = lineItems[i][1];
priceCell.value = lineItems[i][2];
totalCell.formula = "C" + (row + 1) + "*D" + (row + 1);
descCell.style = borderStyle;
qtyCell.style = borderStyle;
priceCell.style = currencyStyle;
totalCell.style = currencyStyle;
}
// Промежуточный итог, налог и общий итог
cells.get("B24").value = "Subtotal:";
const subtotalCell = cells.get("E24");
subtotalCell.formula = "SUM(E21:E23)";
cells.get("B25").value = "Tax (10%):";
const taxCell = cells.get("E25");
taxCell.formula = "E24*0.1";
cells.get("B26").value = "Grand Total:";
const grandTotalCell = cells.get("E26");
grandTotalCell.formula = "E24+E25";
// Полужирный стиль и стиль валюты для итоговых значений
const totalStyle = workbook.createStyle();
totalStyle.font.isBold = true;
totalStyle.custom = '"$"#,##0.00';
subtotalCell.style = totalStyle;
taxCell.style = totalStyle;
grandTotalCell.style = totalStyle;
// Полужирный стиль для подписей итогов
const boldStyle = workbook.createStyle();
boldStyle.font.isBold = true;
cells.get("B24").style = boldStyle;
cells.get("B25").style = boldStyle;
cells.get("B26").style = boldStyle;
// Сохранить книгу как файл OFD
const outputData = workbook.save(AsposeCells.SaveFormat.Ofd);
const blob = new Blob([outputData]);
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = "Invoice.ofd";
downloadLink.style.display = "block";
document.getElementById('result').innerHTML = '<p style="color: green;">Done! Click the download link to get the result file.</p>';
} catch (error) {
console.error(error);
document.getElementById('result').innerHTML = '<p style="color: red;">An error occurred: ' + error.message + '</p>';
}
});
</script>
</body>
</html>
Aspose.Cells также может загрузить существующую рабочую книгу Excel с диска и экспортировать ее непосредственно в формате OFD. Это полезно для конвейеров пакетного преобразования, процессов архивирования и сценариев, в которых исходная рабочая книга была создана другим инструментом и ее необходимо повторно сформировать как артефакт с фиксированной разметкой. В следующем примере загружается существующая рабочая книга .xlsx, считываются данные из ее ячеек, при необходимости корректируются параметры настройки страницы, после чего результат сохраняется в виде документа OFD.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Aspose.Cells Example</title>
</head>
<body>
<h1>Aspose.Cells Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.csv" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, CellsHelper } = AsposeCells;
const fileInput = document.getElementById("fileInput");
const runButton = document.getElementById("runExample");
const downloadLink = document.getElementById("downloadLink");
const result = document.getElementById("result");
const readyPromise = AsposeCells.onReady({
license: "/lic/aspose.cells.enc",
fontPath: "/fonts/",
fontList: ["arial.ttf", "NotoSansSC-Regular.ttf"]
}).then(() => {
console.log("Aspose.Cells initialized");
});
function formatTimestamp(date) {
const pad = value => String(value).padStart(2, "0");
return date.getFullYear() + "-" +
pad(date.getMonth() + 1) + "-" +
pad(date.getDate()) + " " +
pad(date.getHours()) + ":" +
pad(date.getMinutes()) + ":" +
pad(date.getSeconds());
}
function escapeHtml(value) {
const entities = {
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'"
};
return String(value).replace(/[&<>"']/g, character => entities[character]);
}
runButton.addEventListener("click", async () => {
try {
const file = fileInput.files[0];
if (!file) {
result.innerHTML = '<p style="color: red;">Please select an Excel file first.</p>';
return;
}
runButton.disabled = true;
downloadLink.style.display = "none";
downloadLink.removeAttribute("href");
// Открыть существующую книгу Excel с диска
const workbook = new Workbook(new Uint8Array(await file.arrayBuffer()));
// (1) Прочитать и отобразить значения выбранных ячеек, чтобы подтвердить загрузку файла
const firstSheet = workbook.worksheets.get(0);
const cells = firstSheet.cells;
const output = [];
output.push("First sheet name: " + firstSheet.name);
output.push("Cell A1: " + cells.get("A1").stringValue);
output.push("Cell B1: " + cells.get("B1").stringValue);
output.push("Cell C1: " + cells.get("C1").stringValue);
// (2) Перебрать коллекцию Worksheets, чтобы перечислить доступные листы
output.push("");
output.push("Available worksheets:");
for (let i = 0; i < workbook.worksheets.count; i++) {
const ws = workbook.worksheets.get(i);
output.push(" [" + i + "] " + ws.name);
}
// (3) При необходимости обновить ячейку с временной меткой, чтобы отразить преобразование
cells.get("A1").value = "Converted on: " + formatTimestamp(new Date());
// Append a summary header row at the top of the data block
cells.insertRow(0);
cells.get("A1").value = "Conversion Summary";
cells.get("A2").value = "Generated: " + formatTimestamp(new Date());
// (4) Настроить свойства PageSetup на листе
const pageSetup = firstSheet.pageSetup;
pageSetup.orientation = AsposeCells.PageOrientationType.Landscape;
pageSetup.paperSize = AsposeCells.PaperSizeType.PaperA4;
pageSetup.fitToPagesTall = 1;
pageSetup.fitToPagesWide = 1;
// (5) При необходимости задать область печати для вывода OFD
const lastRow = cells.maxDataRow;
const lastCol = cells.maxDataColumn;
const lastColLetter = CellsHelper.columnIndexToName(lastCol);
const printArea = "A1:" + lastColLetter + (lastRow + 1);
pageSetup.printArea = printArea;
output.push("");
output.push("Print area set to: " + printArea);
// (6) Сохранить книгу в формате OFD
const outputData = workbook.save(AsposeCells.SaveFormat.Ofd);
const blob = new Blob([outputData]);
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = "SampleBook.ofd";
downloadLink.textContent = "Download SampleBook.ofd";
downloadLink.style.display = "block";
output.push("");
output.push("File successfully converted to OFD format: SampleBook.ofd");
result.innerHTML =
'<pre style="white-space: pre-wrap;">' +
escapeHtml(output.join("\n")) +
"</pre>" +
'<p style="color: green;">Done! Click the download link to get the result file.</p>';
} catch (error) {
console.error(error);
const message = error && error.message ? error.message : String(error);
result.innerHTML = '<p style="color: red;">Error: ' + escapeHtml(message) + "</p>";
} finally {
runButton.disabled = false;
}
});
</script>
</body>
</html>
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.