How to convert xls file to xlsx file using C#? - c#

I was developing an application which read data from an excel file, but when I try to open it, an exception  was thrown if the source file is saved with the xls format (File contains corrupted data error when opening Excel sheet with OpenXML). indeed when I save this file with the xlsx format it works fine. please help me to solve this problem.

Use Free Spire.XLS dll available via NuGet.
Sample:
Workbook workbook = new Workbook();
workbook.LoadFromFile("Input.xls");
workbook.SaveToFile("Output.xlsx", ExcelVersion.Version2013);

For reliably reading XLS files you could use ExcelDataReader which is a lightweight and fast library written in C# for reading Microsoft Excel files. It supports the import of Excel files all the way back to version 2.0 of Excel (released in 1987!)
Alternatively you could use a file conversion API like Zamzar. This service has been around for 10+ years, and provides a simple REST API for file conversion - it supports XLS to XLSX conversion. You can use it in C# and it has extra features like allowing you to import and export files to and from Amazon S3, FTP servers etc.
Full disclosure: I'm the lead developer for the Zamzar API.

You cannot read xls files with OpenXML.
The solution from Microsoft is to read the xls file with Office Interop (but Interop is not recommended to be used on the server), transfer data from Interop step by step to OpenXML.
Another solution is to use an Excel library like EasyXLS and convert between these two Excel file formats:
ExcelDocument workbook = new ExcelDocument();
workbook.easy_LoadXLSFile("Excel.xls");
workbook.easy_WriteXLSXFile("Excel.xlsx");
Find more information about converting xls to xlsx.
I am not quite sure why you need to convert the file and why you don't just read the xls file, using a different technology then OpenXML, for sure.

XLS is the older Excel file format. XSLX is the newer format stored as OpenXML. XSLX is actually a zip file with the various components stored as files within it. You cannot simply rename the file to get it into the new format. To save the file in XSLX you'll have to save the file into the Excel 2010+ format.
If you're using Excel interop then it is an option on the SaveAs method.
for more info check the function: _Workbook.SaveAs Method
and the property: FileFormat:
Optional Object.
The file format to use when you save the file. For a list of valid choices,
see the FileFormat property. For an existing file, the default format is the
last file format specified; for a new file, the default is the format of the
version of Excel being used.
msdn info here:
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._workbook.saveas(v=office.11).aspx

Related

How to identify an excel file(xls, xlsx, csv) which has been converted from .DLL file in c# dot net core

Basically need to identify the excel is originally created from a valid excel. I have tried using Microsoft.Interop.Excel File format.
Seems like I cannot use this without Microsoft office being installed. So need another approach for this problem.
EDIT :
Basically I want to be able to distinguish a valid excel from invalid one like an excel file which is converted from DLL. Because the file extension will say it is xls. If you try to open that file, it will open an empty workbook without any sheets. But I cannot decide an excel with no sheets is an invalid one.
If you want to idenify wheter file is a valid excel file or not, you can use 'trid file identifier'. TrID - File Identifier.
You can do it own your own also by reading magic number or file signaure bytes. Please go through this question Original file bytes from StreamReader, magic number detection.

Save XLS Using Interop Excel

The Current Setup:
So, I can use the following code to save a file as an XLS:
_myWorkbook.SaveAs("FileName.xls", Excel.XlFileFormat.xlWorkbookNormal)
I can also use the following code to save a file as an XLSX (Since I use Office 2010):
_myWorkbook.SaveAs("FileName.xlsx", Excel.XlFileFormat.xlWorkbookDefault)
The Issue:
I have tried (unsuccessfully) to save the file as an XLSX using the following code:
_myWorkbook.SaveAs("FileName.xlsx", Excel.XlFileFormat.xlExcel12)
Why does this not work? Last I checked, Excel 12 was Excel 2007 (a version that supports XLSX). Am I missing something?
(For those interested, I get a This extension can not be used with the selected file type error)
Actually XlFileFormat.xlExcel12 is Excel 12.0 binary format (xlsb) , for OpenXML (i.e. xlsx) you need to use XlFileFormat.xlOpenXMLWorkbook enum value.
For a complete reference see here.

Read XLS file in memory ASP.Net

I have an xls file sitting in a byte[] as a result of a file upload on my asp.net web application. Is there a library that can read in and process the xls file as a byte[]? I do not want to save the file to disk.
All I need to do is be able to read the cell contents (I would prefer to accept csv file if I had the choice).
I discovered SpreadsheetGear which claims to do this, but I would rather not pay $1000 for software that does way more than I need it to.
Note that I am referring to XLS file and not XLSX file, but I would appreciate advice on both.
You may checkout excellibrary. And if you are dealing with OpenXML (.xlsx) you may checkout the Open XML SDK.
EPPlus is also a solid library for working with Excel files. It has some samples that will show how to interact with a file from a MemoryStream.
http://epplus.codeplex.com/
NOPI has a really good library and it picks up where EPPlus leaves off. http://npoi.codeplex.com/
Your reference to XLS suggests the older Excel 97 format, which in that case you can use the ExcelWorkbook / ExcelWorksheet reader code provided as part of the Tarantino project at the Tarantino Bitbucket Repository
You can pass your XLS in memory as a stream and the helper methods will return a DataSet with workbook data and Tables representing Sheets. You do not need the entire Tarantino project code and can simply grab:
ExcelWorkbookReader.cs
ExcelWorksheetReader.cs
IExcelWorkbookReader.cs
IExcelWorksheetReader.cs
and add these files to your solution.
Using the interface is simple:
[HttpPost]
public ActionResult Uploadfile(HttpPostedFileBase file)
{
var reader = new ExcelWorkbookReader();
var data = reader.GetWorkbookData(file.InputStream);
// Do something with the data here
return RedirectToAction("List");
}
You can read a .xls content without Excel library using ADO.NET and OLEDB driver. But the worksheet must be in "table" format. If this is true, its works fine.
The connection string should be something like this:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
Regards.

Inserting Image in Excel from String

I'm generating a CSV file from the following code
public ActionResult Index()
{
var csv = "मानक हिन्दी;some other value";
var data = Encoding.UTF8.GetBytes(csv);
data = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
var cd = new ContentDisposition
{
Inline = false,
FileName = "newExcelSheet.csv"
};
Response.AddHeader("Content-Disposition", cd.ToString());
return File(data, "text/csv");
}
Now I wish to insert Image in the top row of the excel, Please assist me in the following problem
Thanks :)
CSV is not a format capable of including binary data such as images. The only thing you can include in a CSV file is text.
If you need to add an image to an excel document you would have to use a proper excel file (i.e. a .xls or .xlsx file). There are various APIs that you can use to write to such files, including the Excel Object Model exposed through COM when you have Office installed.
See this question for details on how to insert images through COM.
You can't do it without using the interop assembly. You either go that route or download epplus, a free Excel .Net library that supports what you need.
Code examples on the website:
http://epplus.codeplex.com/
CSV doesn't support what you ask for AND Interop is officially NOT supported by MS in server-scenarios (like ASP.NET...).
You will need to create "real" Excel files (XLS or XLSX) - some options to create Excel files:
MS provides the free OpenXML SDK V 2.0 - see http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx
This can read+write MS Office files (including Excel XLSX but not XLS!).
Another option see http://www.codeproject.com/KB/office/OpenXML.aspx
IF you need more like rendering, formulas etc. then there are different free and commercial libraries like ClosedXML, EPPlus, Aspose.Cells, SpreadsheetGear, LibXL and Flexcel.

Convert XLS to XSLX with Sharepoint and C#

I know about Word Automation Services, where I can start a ConversionJob which enable you to convert a .docx file to e.g. PDF or .doc.
I thought these services also allow the conversion of XLSX to XLS file - I was wrong. When looking at the SaveFormat Enumaration it only supports Word. Excel Automation Services don't seem to have such a conversion job?
How do I convert an XLS file to XLSX without using Excel automation (i.e. without having Excel installed on the server)?
EDIT:
In the end I used Aspose Cells for the conversion.
You might try ExcelLibrary or EPPlus those libraries allow you to write excel files without using excel COM object.
You may read cell by cell and create a new worksheet copied from the other one (copy cell by cell)
I'm note sure that you can do it (converting XLS with is a row MS Excel file without having either Excel Services or MS Excel installed [Using InterOp] to XLSX which an OpenXML format)!!
If you want a way to convert it on a PC which MS Excel install check this link out http://devville.net/blog/2011/02/05/how-to-convert-rtf-document-to-doc-using-c/
But if found a way I would be happy if u share it to use.

Categories