In search for a good managed Excel exporting tool I’ve come to test a Excel library from Winnovative. I’ll follow the same procedure as in my previous Excel-related post about CarlosAG component for easier comparison..
What does it do ?
Create xls/xlsx documents, including containing formulas, images, comments, charts, etc. Operate with CSVs, load data from DataTables, etc. See the feature list yourself.
What do I need ?
Support for data types, unicode, basic formatting, formulas, cell merge, column width – the same things as in my previous excel-component test.
What did I get ?
Functionally - everything I wanted. Actually for not having licence I got one extra sheet reminding me that fact, but that is not going to be the issue for production environments.
The file was decent xlsx-file, I also briefly tested getting the older xls_2003-file and it seemed to be working as well. No warning on open.. just such file:
How did I do it ?
using System;
using System.Globalization;
using System.Threading;
using Winnovative.ExcelLib;
public class WinnovativeExcelTest
{
private const int DummyRows = 15;
public static void Build()
{
//prepare sheet
ExcelWorkbook book = new ExcelWorkbook(ExcelWorkbookFormat.Xlsx_2007);
ExcelWorksheet sheet = book.Worksheets[0];
sheet.Name = "Sample";
//create data
int currentRow = 1;
sheet["A1:D1"].Merge(); //wow, we can use excel style range instead of coordinates.
sheet["A1"].Text = "demonstrate merge";
BuildHeaderRow(sheet, ++currentRow);
for(int i = 1; i <= DummyRows; i++)
{
BuildDataRow(sheet, i, ++currentRow);
}
BuildSummaryRow(sheet, ++currentRow);
//I don't like the default it offered so I'm setting it myself:
sheet[currentRow - DummyRows, 4, currentRow +1, 4].Style.Number.NumberFormatString
= Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;
//corrigate column widths:
sheet.AutofitColumns();
//output result
book.Save("Winnovative_result.xlsx");
}
private static void BuildHeaderRow(ExcelWorksheet sheet, int toRow)
{
sheet[toRow, 1].Text = "index";
sheet[toRow, 2].Text = "1/index";
sheet[toRow, 3].Text = "name";
sheet[toRow, 4].Text = "datetime";
sheet[toRow, 1, toRow, 4].Style.Font.Bold = true;
}
private static void BuildDataRow(ExcelWorksheet sheet, int dataIndex, int toRow)
{
//generate dummy data row using dataIndex for values:
sheet[toRow, 1].Value = dataIndex;
sheet[toRow, 2].Value = (1.0/dataIndex); //decimal is not recognized as number, by doc floats are.
sheet[toRow, 3].Value = "Ilus õõvaöö nr " + dataIndex.ToString(CultureInfo.InvariantCulture);
sheet[toRow, 4].Value = DateTime.Today.AddDays(dataIndex);
}
private static void BuildSummaryRow(ExcelWorksheet sheet, int toRow)
{
sheet[toRow, 1].Formula = String.Format("=AVERAGE(A{0}:A{1})", toRow-DummyRows, toRow-1);
sheet[toRow, 2].Formula = String.Format("=SUM(B{0}:B{1})", toRow-DummyRows, toRow-1);
sheet[toRow, 4].Formula = String.Format("=D{0}+1", toRow-1);
}
}
Some subjective numbers:
-
~64 lines of code (including empty lines, usings, etc)
-
runs approx 55-60 ms on E8300 @2.83GHz, 4GB RAM.
What do I think ?
I may be a bit biased toward them because I’ve used their PDF libraries before, but it DID feel good to code this API, clean and simple.
The good
-
Fully managed code, .Net fw 2.0
-
Single dll deployment (~3.5 MB)
-
Seems to do everything I need + more
-
by documentation, did not try them all.
-
images, comments, hidden columns, DataTable to sheet, etc ..
-
-
Good sleek API
-
you don’t get drowned in methods but you can do a lot with the ones given.
-
very friendly and flexible cell referencing tools
-
indexed (row 1, col 1) or “A1”-style
-
the same for cell ranges
-
-
dynamically tracking the cells to use: no manual creation of 100 empty lines to add a single value to 100th row.
-
applying styles on the fly to cells/ranges. no manual messing with prepared styles unless you want to.
-
-
Automatic cell value type detection
-
no need to format datetimes (unless you want to) or think about decimal separator.
-
-
Good documentation
-
sample project in package.
-
xmldoc alongside dll
-
helpful user guide (I had two questions during this testing, I found both answers with less than a minute from the manual.
-
-
Respectable company
- For all the bugs I’ve seen in their products, I’ve seen also the release to fix it.
- there is tech support.
- Fully functional evaluation possible
- Can test everything before buying. The only addition is one extra sheet in file reminding that you cannot go live without a licence.
- The same dll as the licenced version. Adding a licence 2 days before release will not give dll-problems.
The bad
-
It’s not free
-
prices start from 350$. Too expensive to buy for personal use, but for enterprises this is good value for the money.
-
licence key should be stored within system.
-
-
It’s not open source
-
no legal way to know or modify what the component does..
-
-
.NEt requirements
-
it requires System.Web which means it cannot be used with .NET FW 4 client profile. This may be important in some scnearios.
-
it requires .NET 2.0, but i don’t think this is a problem. FW 1.1 applications should have died out a long time ago.
-
- Noticable dll size
-
3.5MB is not too heavy and we have tons of RAM and HDD but smaller size would be even nicer.
-
-
Could be slower than some alternatives
-
I didn’t do proper performance-testing but for this ultrasmall sample file it was ca 25% slower than CarlosAG.
-
-
Decimals are not automatically recognized as number types.
-
floats can be used instead or kept as general type (default). Not sure if this is a excel limitation or Winnovative component optimization.
-
Kommentaare ei ole:
Postita kommentaar