Current Format of excel getting changed in Closedxml SaveAs method - c#

In my C# application, I am using ClosedXml .Excel for working with excel files.
I have an excel template, where I add the template into application and add data to the excel sheet and save the excel as below,
wb = new XLWorkbook(exportOption.FileName);
---
if (wb.Worksheets.Count > 0)
{
for (int i = 0; i < wb.Worksheets.Count; i++)
{
using (var ws = wb.Worksheet(i + 1))
{
if (ws.Visibility == XLWorksheetVisibility.Visible)
{
ws.SetTabActive();
break;
}
}
}
}
try
{
wb.CalculateMode = XLCalculateMode.Auto;
wb.SaveAs(exportOption.FileName);
}
After saving the changes my excel format completely changes with other sheets as well.
For example, In one sheet i have percentage format which changes to Date format.
How can i keep the format of excel same and just insert data to other sheets.

Its common for Excel to be tricked into treating numbers as dates (as under the hood Excel stores dates as numbers). To force the cell to be a number not date try:
ws.Cell(row,col).SetValue<double>(Convert.ToDouble(val));
Here is the official documentation on ClosedXML Cell Formatting.
If you need preserve the format as percentage, eg as "#.##%" simply set the cell format:
ws.Cell(row, col).Style.NumberFormat.NumberFormatId = 10;
or untested
ws.Cell(row, col).Style.NumberFormat.Format = "0.0%";

You must select the cell Number Format from your app before saving it.
CLosedXml is a library based on OPENXML library so you must apply an OpenXml excel style Sheet to change Cells Number Format.
This is an Article that may help you

Related

EPPLUS preserve date format when saving CSV

I am using EPPLUS to create a csv file. When I create an Excel file, I can format the date thus:
ws.Cells["A:A"].Style.Numberformat.Format = "yyyy-MMM-dd";
Which is what I need in my csv. However, if I try to save the worksheet as a csv, any dates end up as numbers.
***EDIT - I appreciate Excel stores the date as a serial number, I was just wondering if EPPLUS had a feature I can't locate to help me out.
Assuming you are setting the value to a proper DateTime value in code, you should be able to use the Text property of the cell like this:
var ws = package.Workbook.Worksheets.Add("Test");
ws.Cells["A:A"].Style.Numberformat.Format = "yyyy-MMM-dd";
ws.Cells["A1"].Value = DateTime.Now;
Console.WriteLine(ws.Cells["A1"].Text); // "2022-May-26"

Search text in particular column and retrieve data from another column in excel using C#

I have an Excel file of 20 columns and there are about 150 records. I need to search for a particular string in a particular column with header "DESCRIPTION"(usually column b). The search string and column header values come from an INI File. After the search is found, I need to copy the value in column J (again from INI file) to the output file.
I am new to C#. Can somebody help me here. I tried Range.Find but I got confused.
Usually OLEDB with SQL like statements can be used to retrieve specific column or row data. Please go throgh following solutions:
http://www.c-sharpcorner.com/UploadFile/6b8651/read-excel-file-in-windows-application-using-C-Sharp/
https://www.codeproject.com/articles/1088970/read-write-excel-file-with-oledb-in-csharp-without
Hope this will give you some idea. But try to show some of your code so that members can have the better understanding of your approach. Thanks
Apart from Oledb connection you can also use ClosedXML. ClosedXML is a wrapper around OpenXML that allows you to easily work with .XLSX files.
https://github.com/ClosedXML/ClosedXML.
You can look at the documentation that'll help you understand how to search for text.
If you want to search .XLS files, then you can use the Microsoft Excel Interoperability libraries. These libraries cannot be used in a web app, are slower than ClosedXML but they support all kinds of Excel files.
You can use free version of GemBox.Spreadsheet to search for a text in both XLS and XLSX file formats. Also regarding the INI file, you can use MadMilkman.Ini.
Here is an example that you could try:
// Load INI file.
IniFile ini = new IniFile();
ini.Load("Sample.ini");
// Get INI values.
string header = ini.Sections["SampleSection"].Keys["ColumnHeaderValue"].Value;
string search = ini.Sections["SampleSection"].Keys["SearchTextValue"].Value;
string j = ini.Sections["SampleSection"].Keys["JColumnValue"].Value;
// Load XLSX file.
ExcelFile excel = ExcelFile.Load("Sample.xlsx");
ExcelWorksheet sheet = excel.Worksheets[0];
// Find column header value in first row.
ExcelColumn searchColumn = sheet.Rows[0].Cells
.First(cell => cell.ValueType == CellValueType.String && cell.StringValue == header)
.Column;
// Find search value in column.
int r, c;
searchColumn.Cells.FindText(search, false, false, out r, out c);
ExcelCell searchCell = sheet.Cells[r, c];
// Get cell from column "J" that is in the same row as cell that has search text.
ExcelCell jCell = sheet.Cells[r, ExcelColumnCollection.ColumnNameToIndex("J")];
// Set cell value.
jCell.Value = j;
// Save XLSX file.
excel.Save("Sample.xlsx");

Merging excel cells based on the cell value using c#

I am using excel with c# I want to merge all adjacent cells that contain a specific value using c# code.
I want to merge all the cells that contains the value (Merged cells) using c# code
i want it to be like this
First, you need to identify the cells where the range of repetitive value starts and where it ends.
Then, use this code to merge the cells:
String startRange = "A1";
String endRange = "D3";
String repetitiveValue = "Merged Cells";
Microsoft.Office.Interop.Excel.Range range = worksheet.Range[startRange, endRange];
range.Value2 = repetitiveValue;
range.Select();
range.Merge(Missing.Value);
You need to use one or the other Office library, which can help you with reading/writing spreadsheets & also with the cell merges.
Check SpreadSheetGear.net or PowerTools for OpenXml (for >= office 2007 formats)
http://ericwhite.com/blog/powertools-for-open-xml-expanded/

How to create table of contents for an Excel file generated by C#?

I have to implement an Excel export in an application where the exported Excel file should contain something like a table of contents on the second sheet.
This sheet should refer to the other sheets with page numbers - so if the customer prints out the Excel file, they can use this table of contents.
Given some assumptions on the page size, margins, etc., does anyone have an idea on what kind of library should I use to fulfill this requirement?
Or the only possible way of doing this is calculating the page numbers with VBA macros?
If anyone is interested, it seems that I can use Aspose.Cells to calculate the page numbers for the table of contents:
var workbook = new Workbook("Erstfassung.xls");
var pagesSoFar = 0;
foreach (var worksheet in workbook.Worksheets)
{
var pageCount = worksheet.GetPrintingPageBreaks(new ImageOrPrintOptions()).Length;
Console.WriteLine($"{worksheet.Name} - ({pageCount} long), starts from {pagesSoFar}");
pagesSoFar += pageCount;
}

Read excel file (.xlsx or .xls) with displayed formatting (indentation)?

I want read all data from file with the same formatting as showing when I open excel file. I mean the same indent, which is set in "Format cell". All methods I tried works fine but remove indentation (formatting).
Checked already ExcelDataReader, Oledb, Interop.
You can use EasyXLS Excel Reader. You can read both xls or xlsx files.
This code sample reads the value and the indent from A1 cell:
ExcelDocument workbook = new ExcelDocument();
// Read XLSX file
workbook.easy_LoadXLSXFile("file.xlsx");
// Get the table of the first worksheet
ExcelTable table = ((ExcelWorksheet)workbook.easy_getSheetAt(0)).easy_getExcelTable();
//Get the value from A1 cell
String value = table.easy_getCell(0, 0).getValue();
//Get the indent from A1 cell
int indent = table .easy_getCell(0, 0).getStyle().getIndent();
You can also read other formatting settings. In a similar way you can read xls files also.

Categories

Resources