Build 3.5.0.29 of xlsgen makes it possible to insert arbitrary OLE objects in XLS and XLSX files.
Both a cell-based API and a pixel-based API are available, so you can pick which one you prefer.
Here is an example of how it works (C#) :
IXlsWorksheet worksheet = workbook.AddWorksheet( "Sheet1" );
IXlsOLEObject oleObject = worksheet.OLEObjects.NewOLEObjectInPixels("C:\\tmp\\cylinders.pdf",
100, //top
50, //left
350, //bottom
658 //right
);