Selv om vi applikasjonsutviklere ikke liker det, så er det nå engang slik at vi må forholde oss til Office-produktene. I ethvert prosjekt så dukker det opp et krav om at man skal kunne eksportere til Excel osv.
Når man da lager web applikasjoner, så krever det en server-side generering av office-dokumenter. Dette fører ofte til at man installerer Office på serveren, og bruker Ole-kall eller tilsvarende for å generere dokumentene. Det er mange grunner til at dette IKKE er noen god løsning(jeg overlater det til leseren som en øvelse å lukte frem hvorfor).
Men nå som Microsoft har valgt å lage en åpen standard basert på xml(Office Open XML Format) for sine officeprodukter så åpner det seg nye muligheter. Dette ligger som grunn i Office 2007, men ved å installere en konverter så er det bakoverkompatibelt med office 2003.
Jeg fant et fint bibiliotek som abstraherer ytterligere det å integrere mot Excel. Dette passet som hånd i hanske på det jeg skulle gjøre. Biblioteket heter ExcelPackage Open Xml.
Se hvor enkel koden ble: (og husk: ingen office på serveren!)
Guid g = Guid.NewGuid();
string filsti = HttpContext.Current.Server.MapPath("../../temp");
string templateSti = HttpContext.Current.Server.MapPath("../../Maler/minmal.xlsx");
FileInfo routerlistefil = new System.IO.FileInfo(filsti + @"\" + g.ToString() + ".xlsx");
FileInfo template = new FileInfo(templateSti);
using (ExcelPackage xlPackage = new ExcelPackage(routerlistefil, template))
{
ExcelWorksheet ewb = xlPackage.Workbook.Worksheets["Routerliste"];
xlPackage.DebugMode = true;
xlPackage.Workbook.CalcMode = ExcelCalcMode.Automatic;
DataTable dt = minDAL.HentData(int id);
int hStyle = ewb.Cell(rad, kolonneStart).StyleID;
// overskrifter
foreach (DataColumn dc in dt.Columns)
{
ewb.Cell(rad, hkolonne).StyleID = hStyle;
ewb.Cell(rad, hkolonne).Value = dc.ColumnName;
hkolonne++;
}
rad++;
//innhold
int iStyle = ewb.Cell(radStart + 1, kolonneStart).StyleID;
foreach (DataRow dr in dt.Rows)
{
int kolonne = kolonneStart;
foreach (DataColumn dc in dt.Columns)
{
ewb.Cell(rad, kolonne).Value = " " + dr[dc].ToString();
ewb.Cell(rad, kolonne).StyleID = iStyle;
kolonne++;
}
rad++;
}
xlPackage.Save();
}
excelExpKlikkLabel.Visible = true;
excelRapp.Visible = true;
excelRapp.NavigateUrl = "~/temp/" + g.ToString() + ".xlsx";