Managing OLE Objects with JavaScript via C++
Introduction
OLE (Object Linking and Embedding) is a framework for compound document technology. Briefly, a compound document is something like a display desktop that can contain visual and information objects of all kinds: text, calendars, animations, sound, motion video, 3D, continually updated news, controls, and so forth. Each desktop object is an independent program entity that can interact with a user and also communicate with other objects on the desktop.
OLE is supported by many different programs and is used to make content created in one program available in another. For example, you can insert a Microsoft Word document into Microsoft Excel. To see what types of content you can insert, click Object on the Insert menu. Only programs that are installed on the computer and that support OLE objects appear in the Object type box.
Inserting OLE Objects into the Worksheet
Aspose.Cells for JavaScript via C++ supports adding, extracting, and manipulating OLE objects in worksheets. For this reason, Aspose.Cells has the OleObjectCollection class, used to add a new OLE Object to the collection. Another class, OleObject, represents an OLE Object. It has some important members:
- The imageData property specifies the image (icon) data of byte array type. The image will be displayed to show the OLE Object in the worksheet.
- The objectData property specifies the object data in the form of a byte array. This data will be shown in its related program when you double-click on the OLE Object icon.
The following example shows how to add an OLE Object(s) into a worksheet.
<!DOCTYPE html>
<html>
<head>
<title>Add OLE Object Example</title>
</head>
<body>
<h1>Add OLE Object Example</h1>
<p>
Select an image to display for the OLE object (e.g., logo.jpg) and a file to embed into the OLE object (e.g., book1.xls).
</p>
<label>Image (for OLE display): <input type="file" id="imageInput" accept="image/*" /></label>
<br/>
<label>Object to embed (e.g., .xls): <input type="file" id="objectInput" accept=".xls,.xlsx,.doc,.docx,.pdf" /></label>
<br/>
<button id="runExample">Add OLE Object and Save</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, Utils } = AsposeCells;
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 () => {
const imageInput = document.getElementById('imageInput');
const objectInput = document.getElementById('objectInput');
const resultDiv = document.getElementById('result');
if (!imageInput.files.length) {
resultDiv.innerHTML = '<p style="color: red;">Please select an image file for the OLE display.</p>';
return;
}
if (!objectInput.files.length) {
resultDiv.innerHTML = '<p style="color: red;">Please select a file to embed into the OLE object.</p>';
return;
}
// Read files
const imageFile = imageInput.files[0];
const objectFile = objectInput.files[0];
const imageBuffer = await imageFile.arrayBuffer();
const objectBuffer = await objectFile.arrayBuffer();
// Instantiate a new Workbook.
const workbook = new Workbook();
// Get the first worksheet.
const sheet = workbook.worksheets.get(0);
// Add an Ole object into the worksheet with the image shown in MS Excel.
// Position: row 14, column 3, width 200, height 220 (same as JavaScript example)
sheet.oleObjects.add(14, 3, 200, 220, new Uint8Array(imageBuffer));
// Set embedded ole object data (converted setter to property assignment)
sheet.oleObjects.get(0).objectData = new Uint8Array(objectBuffer);
// Save the excel file (Excel97To2003 format to match .xls)
const outputData = workbook.save(SaveFormat.Excel97To2003);
const blob = new Blob([outputData]);
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = URL.createObjectURL(blob);
downloadLink.download = 'output.out.xls';
downloadLink.style.display = 'block';
downloadLink.textContent = 'Download Modified Excel File';
resultDiv.innerHTML = '<p style="color: green;">OLE object added successfully! Click the download link to get the modified file.</p>';
});
</script>
</html>
Extracting OLE Objects in the Workbook
The following example shows how to extract OLE Objects in a Workbook. The example gets different OLE objects from an existing XLS file and saves different files (DOC, XLS, PPT, PDF, etc.) based on the OLE object’s file format type.
After running the code, we can save different files based on their respective OLE Objects format types.
<!DOCTYPE html>
<html>
<head>
<title>Aspose.Cells Example - Extract OLE Objects</title>
</head>
<body>
<h1>Extract OLE Objects from Excel</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx,.xlsb" />
<button id="runExample">Extract OLE Objects</button>
<div id="downloadContainer"></div>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, Utils } = AsposeCells;
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 () => {
const fileInput = document.getElementById('fileInput');
const downloadContainer = document.getElementById('downloadContainer');
const result = document.getElementById('result');
downloadContainer.innerHTML = '';
result.innerHTML = '';
if (!fileInput.files.length) {
result.innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Instantiating a Workbook object from uploaded file
const workbook = new Workbook(new Uint8Array(arrayBuffer));
// Get the OleObject Collection in the first worksheet.
const worksheet = workbook.worksheets.get(0);
const oles = worksheet.oleObjects;
// Loop through all the oleobjects and extract each object.
for (let i = 0; i < oles.count; i++) {
const ole = oles.get(i);
// Specify the output filename.
let ext = 'jpg';
// Specify each file format based on the oleobject format type.
switch (ole.fileFormatType) {
case AsposeCells.FileFormatType.Doc:
ext = "doc";
break;
case AsposeCells.FileFormatType.Xlsx:
ext = "xlsx";
break;
case AsposeCells.FileFormatType.Ppt:
ext = "ppt";
break;
case AsposeCells.FileFormatType.Pdf:
ext = "pdf";
break;
case AsposeCells.FileFormatType.Unknown:
ext = "jpg";
break;
default:
ext = "bin";
break;
}
const fileName = `ole_${i}.${ext}`;
// Save the oleobject as a new excel file if the object type is xlsx.
if (ole.fileFormatType === AsposeCells.FileFormatType.Xlsx) {
const ms = new Uint8Array(ole.objectData);
const oleBook = new Workbook(ms);
oleBook.settings.isHidden = false;
const outputData = oleBook.save(SaveFormat.Xlsx);
const blob = new Blob([outputData]);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = `Excel_File${i}.out.xlsx`;
link.textContent = `Download Excel_File${i}.out.xlsx`;
link.style.display = 'block';
downloadContainer.appendChild(link);
} else {
// Create the files based on the oleobject format types.
const data = ole.objectData;
const blob = new Blob([data]);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = fileName;
link.textContent = `Download ${fileName}`;
link.style.display = 'block';
downloadContainer.appendChild(link);
}
}
result.innerHTML = '<p style="color: green;">OLE object extraction completed. Use the links above to download the files.</p>';
});
</script>
</html>
Extracting Embedded MOL File
Aspose.Cells for JavaScript via C++ supports extracting objects of uncommon types like MOL (Molecular data file containing information about atoms and bonds). The following code snippet demonstrates extracting an embedded MOL file and saving it to disk by using this sample excel file.
<!DOCTYPE html>
<html>
<head>
<title>Extract OLE Objects Example</title>
</head>
<body>
<h1>Extract OLE Objects Example</h1>
<input type="file" id="fileInput" accept=".xls,.xlsx" />
<button id="runExample">Run Example</button>
<a id="downloadLink" style="display: none;">Download Result</a>
<div id="result"></div>
</body>
<script src="aspose.cells.js.min.js"></script>
<script type="text/javascript">
const { Workbook, SaveFormat, Utils } = AsposeCells;
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 () => {
const fileInput = document.getElementById('fileInput');
if (!fileInput.files.length) {
document.getElementById('result').innerHTML = '<p style="color: red;">Please select an Excel file.</p>';
return;
}
const file = fileInput.files[0];
const arrayBuffer = await file.arrayBuffer();
// Instantiating a Workbook object from uploaded file
const workbook = new Workbook(new Uint8Array(arrayBuffer));
let index = 1;
const worksheets = workbook.worksheets;
const sheetCount = worksheets.count;
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = '';
for (let i = 0; i < sheetCount; i++) {
const sheet = worksheets.get(i);
const oles = sheet.oleObjects;
const oleCount = oles.count;
for (let j = 0; j < oleCount; j++) {
const ole = oles.get(j);
const data = ole.objectData;
const blob = new Blob([data], { type: 'application/octet-stream' });
const url = URL.createObjectURL(blob);
const fileName = `OleObject${index}.mol`;
const link = document.createElement('a');
link.href = url;
link.download = fileName;
link.textContent = `Download ${fileName}`;
link.style.display = 'block';
resultDiv.appendChild(link);
index++;
}
}
if (!resultDiv.hasChildNodes()) {
resultDiv.innerHTML = '<p>No OLE objects found in the workbook.</p>';
} else {
const info = document.createElement('p');
info.style.color = 'green';
info.textContent = 'OLE objects extracted. Click the links to download the extracted .mol files.';
resultDiv.insertBefore(info, resultDiv.firstChild);
}
});
</script>
</html>