using OfficeOpenXml - Print cell.Value as Number - c#

I am having some Cell values printed as Taxt (String) and i want them to be printed as Number, as this values are used in a Sum Formula.
The values came from an operation that i do with a library (OSISoft AF SDK) and are printed in my Excel as Strings.
ExcelRange cell = excelSheet.Cells[startRow, startCol + i + y];
cell.Value = valueAsString;
Just in case someone is using AF SDK as me getting data from PI Systems my code is actually something like this...
//point is a PIPoint.
cell.Value = point.RecordedValue(startDate.LocalTime.AddHours(i), OSIsoft.AF.Data.AFRetrievalMode.AtOrBefore);

Just parsing the value to double (or int) will be okey.
cell.Value = Double.Parse(cell.Value.ToString());
You can also set a Format to the number, but it is not necessary:
cell.Style.Numberformat.Format = "0.00";
All formats available:
https://stackoverflow.com/a/40214134/6574873

Related

Set a formula in a cell of the sheet

Does anyone have an example of how to define a formula in a cell?
I have this, but in the sheet it says unparseable:
new Cell
{
ColumnId = columnMapA["Sociedad"],
Formula = "=VLOOKUP([# de servicio]" + Rownumber + "; {Catálogo de Materiales Rango 1}; 2; false)"
}
I'm not sure that this is the only problem but you should use commas as argument separators, not semicolons, i.e.
new Cell
{
ColumnId = columnMapA["Sociedad"],
Formula = "=VLOOKUP([# de servicio]" + Rownumber + ", {Catálogo de Materiales Rango 1}, 2, false)"
}
I was able to include a row number in the cell using "#row". That information can be found here:
https://help.smartsheet.com/articles/2476491-create-efficient-formulas-with-at-cell
Also, I'm not sure about language settings in SmartSheet, but you could try writing the word "Range" in English and see if that helps.
Here's an example I've used:
new Cell
{
ColumnId = COLUMNID,
Formula = "=VLOOKUP([# de servicio]#row, {Catálogo de Materiales Range 1}, 2, false)"
}
You could also try changing the last parameter to 'true'. That tells VLOOKUP to find an approximate match instead of an exact match.

EPPlus number format

I have an Excel sheet generated with Epplus, I am experiencing some pain points and I wish to be directed by someone who have solved a similar challenge.
I need to apply number formatting to a double value and I want to present it in Excel like this.
8 → 8.0
12 → 12.0
14.54 → 14.5
0 → 0.0
Here is my code
ws.Cells[row, col].Style.Numberformat.Format = "##0.0";
The final Excel file always append E+0 to the end of this format and therefore presents the final values like this instead.
8 → 8.0E+0
12 → 12.0E+0
14.54 → 14.5E+0
0 → 000.0E+0
When I check in the format cells of the generated Excel sheet, I see that my format appears as ##0.0E+2 instead of ##0.0 that I applied.
What may be wrong?
Here are some number format options for EPPlus:
//integer (not really needed unless you need to round numbers, Excel will use default cell properties)
ws.Cells["A1:A25"].Style.Numberformat.Format = "0";
//integer without displaying the number 0 in the cell
ws.Cells["A1:A25"].Style.Numberformat.Format = "#";
//number with 1 decimal place
ws.Cells["A1:A25"].Style.Numberformat.Format = "0.0";
//number with 2 decimal places
ws.Cells["A1:A25"].Style.Numberformat.Format = "0.00";
//number with 2 decimal places and thousand separator
ws.Cells["A1:A25"].Style.Numberformat.Format = "#,##0.00";
//number with 2 decimal places and thousand separator and money symbol
ws.Cells["A1:A25"].Style.Numberformat.Format = "€#,##0.00";
//percentage (1 = 100%, 0.01 = 1%)
ws.Cells["A1:A25"].Style.Numberformat.Format = "0%";
//accounting number format
ws.Cells["A1:A25"].Style.Numberformat.Format = "_-$* #,##0.00_-;-$* #,##0.00_-;_-$* \"-\"??_-;_-#_-";
Don't change the decimal and thousand separators to your own
localization. Excel will do that for you.
By request some DateTime formatting options.
//default DateTime pattern
worksheet.Cells["A1:A25"].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
//custom DateTime pattern
worksheet.Cells["A1:A25"].Style.Numberformat.Format = "dd-MM-yyyy HH:mm";
Addition to Accepted Answer, because value Accept Object you must pass Number to Value For Example if your input is in string :
var input = "5";
ws.Cells["A1:A25"].Value = double.Parse(input);
Another addition to the accepted answer: you can use nullable values and the formatting all looks good BUT it ends up being a string in Excel and you can't SUM, AVG etc.
So make sure you use the actual Value of the nullable.
And if you want to format a specific column like column "B" to number format you can do it this way-
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("SHEET1");
worksheet.Cells["A1"].LoadFromDataTable(dataTable, PrintHeaders: true);
for (var col = 1; col < dataTable.Columns.Count + 1; col++)
{
if (col == 2)//col number 2 is equivalent to column B
{
worksheet.Column(col).Style.Numberformat.Format = "#";//apply the number formatting you need
}
worksheet.Column(col).AutoFit();
}
return File(package.GetAsByteArray(), XlsxContentType, "report.xlsx");//downloads file
}
I solved it as follows, so I just load the model and change as per my model if it is int ordatetime
var li = typeof(Model)
.GetProperties()
.ToArray();
using (var package = new ExcelPackage(stream))
{
var workSheet = package.Workbook.Worksheets.Add("Sheet1");
var i = 0;
foreach (var c in li)
{
i++;
if(c.PropertyType.Name == typeof(DateTime).Name || c.PropertyType.Name == typeof(DateTime?).Name)
workSheet.Column(i).Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern; ;
if (c.PropertyType.Name == typeof(int).Name || c.PropertyType.Name == typeof(int?).Name)
workSheet.Column(i).Style.Numberformat.Format = "0";
}
}

Better way to insert excel range as row and copy formats using c#

I have to insert row of range which has many merged cells,styling and number format many times before writing data to them.
When I insert a row its not copying maerged cells ,style or number formats etc.
Hence I selecting range as a row and insert the same,and copying the previous row to newly inserted row.
This process taking more and more time as i had to do this many times .
This is how I'm doing
Range rangeToInsert = Worksheet1.get_Range("a" + Convert.ToString(20), "z" + Convert.ToString(20));
Range rangeToInsertRow= rangeToInsert.EntireRow;
rangeToInsertRow.Insert(app.XlInsertShiftDirection.xlShiftDown, false);
Range InsertedRowRange= Worksheet1.get_Range("a" + Convert.ToString(newrowNum), "z" + Convert.ToString(newrowNum));
rangeToInsert.copy(InsertedRowRange);
Please suggest if there is any optimization to my code to do Row insert/copying style faster.
Maybe try like this
Range rngToCopy = ws.get_Range("A" + 20, "Z" + 20);
rngToCopy.Copy();
rngToCopy.Offset[1, 0].Insert(XlInsertShiftDirection.xlShiftDown, XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
also you could wrap the entire copy-paste snippet with (before any work on cells)
xlApp.ScreenUpdating = false;
and (after you've done modifying cells)
xlApp.ScreenUpdating = true;

Office Open XML SDK Spreadsheet how to display currency symbol in front of number?

As you've read in the title, I've been looking for a way to format a spreadsheet cell with currency format. Using the code below I do get my currency format but the currency symbol is displayed after the numbers.
// currency format
stylesheet.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.CellFormats>().InsertAt<DocumentFormat.OpenXml.Spreadsheet.CellFormat>(
new DocumentFormat.OpenXml.Spreadsheet.CellFormat()
{
NumberFormatId = 164,
ApplyNumberFormat = true
},
8);
Does anyone know the NumberFormatId for currency format that display currency symbol in the front?
It turns out I need to add basic style to my spreadsheet. The code below adds basic style for currency.
// Currency
stylesheet.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.NumberingFormats>().InsertAt<DocumentFormat.OpenXml.Spreadsheet.NumberingFormat>(
new DocumentFormat.OpenXml.Spreadsheet.NumberingFormat()
{
NumberFormatId = 164,
FormatCode = "\"" + System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.CurrencySymbol + "\"\\ " + "#,##0.00"
},0);
Thanks #Vadim for replying.
I tried to improve above suggestion because I tried same and didn't get $ sign with negative value. I applied following changes and fixed the $ sign issue with negative values.
stylesheet.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.NumberingFormats>().InsertAt<DocumentFormat.OpenXml.Spreadsheet.NumberingFormat>(
new DocumentFormat.OpenXml.Spreadsheet.NumberingFormat()
{
NumberFormatId = 164,
FormatCode = "\"" + System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.CurrencySymbol + "\"\\ " + "#,##0.00;" + "\"(" + System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.CurrencySymbol + "\"\\ " + "#,##.00)[Red];0.00"
}, 0);
Output : for positive values $ 1.23
for negative values ($ 1.23) { font color is read)
How about changing the text direction of the cell? Worked for me.

In MS chart, #PERCENT{N} keyword will not return only a numeric value without decimal

am using Ms chart and i just need a number or numeric value for percentage calculation so for that am using #PERCENT{N} but its returning a decimal value like 0.45 0.78 0.11 etc.. which i do not need, i want it should give me like only numeric value like 45 78 11 23 etc.. please see my below code. its just a part of my coding am posting here. please help me out.
LegendCellColumn PercentageColumn = new LegendCellColumn();
PercentageColumn.Text = "#PERCENT{N}";
PercentageColumn.HeaderText = "%";
PercentageColumn.Name = "Percentage %";
//avgColumn.HeaderBackColor = Color.WhiteSmoke;
Chart1.Legends[0].CellColumns.Add(PercentageColumn);
What should i make with this to get only numeric value with out decimal value.
Thanks
Decimal outDec;
if (Decimal.TryParse("<some string>", out outDec))
{
// Sets Decimal as a Percentage out of 100
PercentageColumn.Text = Convert.ToInt32(outDec * 100).ToString();
}
Edit
To do it specifically using String formatting :
PercentageColumn.Text = "#PERCENT{P0}";
From: Social.MSDN - Shows Percentages on Pie Chart ( Aspnet)
and
MSDN - Standard Numeric Format Strings

Categories

Resources