Ik werk met een SQL-database die Excel-bestanden (samen met andere bestandstypen zoals PDF) opslaat als binaire gegevens. Ik gebruik de volgende code om deze bestanden naar het bestandssysteem te extraheren.
Het probleem:
PDF-bestanden komen er goed uit. Maar voor Excel worden de bestanden aangemaakt en wanneer ik ze probeer te openen, crashen ze of geven ze me gewoon vuilnis.
Ik gebruik deze code van de vorige gast die deze app heeft geschreven voor het ophalen van bestanden. Deze code maakt gebruik van OpenMcdf die ik niet volledig begrijp, omdat ik er geen bruikbare online documentatie voor kon vinden.
//execution starts here
public override void SaveToDisk()
{
byte[] keys = { (byte)0xd0, (byte)0xcf };
//Searches through m_RawOleObject for combination of 'keys'
int offset = Utils.SearchBytes(m_RawOleObject, keys); //returns '60' in case of Excel and '66' in case of Pdf
//m_RawOleOjbect contains the data from the sqlDataReader (the binary data from the column.)
m_RawOleObject = strip(m_RawOleObject, offset);
MemoryStream ms = new MemoryStream(m_RawOleObject);
CompoundFile cf = new CompoundFile(ms);
GetStorageByName(cf.RootStorage, m_StorageName);
if (Storage != null)
{
if (Storage is CFStream)
{
m_RawOleObject = (Storage as CFStream).GetData();
}
m_filename = System.IO.Path.Combine(STOREPATH, Utils.CombineFilenameWithExtension(Filename, m_extension));
WriteToFile(m_filename, m_RawOleObject);
}
}
protected void WriteToFile(string fn, byte[] obj)
{
fn = GetNextAvailableFilename(fn, 0);
FileStream fs = new FileStream(fn, FileMode.Create);
BinaryWriter writer = new BinaryWriter(fs);
writer.Write(obj);
writer.Close();
fs.Close();
fs.Dispose();
}
protected void GetStorageByName(CFStorage cfs, string name)
{
VisitedEntryAction va = delegate(CFItem target)
{
if (target is CFStorage)
{
GetStorageByName((CFStorage)target, name);
}
else
{
if (target.Name == name)
Storage = target;
}
};
//Visit NON-recursively (first level only)
cfs.VisitEntries(va, false);
}
Om het even welke ideeën wat hier gebeurt? waarom zijn de excels beschadigd? Ik kon niet veel online vinden ondanks uren zoeken!
eventuele ideeën, suggesties of oplossingen worden op prijs gesteld.
Bedankt