my export code
This code writes data in excel but the contents are fitting in to the cells. they are scattered.
public static void export_to_excel
the reason thay are scattered is that you are using a tab(\t) separator,use "," separator. For exporting values only, you should export the file as csv file. the advantages: - It does not require to install Excel. - No need for COM interop calls. (By the way it makes your code single threaded and not scalable for multiple CPU/threads) - Excel can read csv files directly.
Export code:
public static void export_to_excelAsCsvFile(DataGridView dGV, string filename)
{
string separator = ",";
StringBuilder stOutput = new StringBuilder();
// Export titles:
StringBuilder sHeaders = new StringBuilder();
for (int j = 0; j < dGV.Columns.Count; j++)
{
sHeaders.Append(dGV.Columns[j].HeaderText);
sHeaders.Append(separator);
}
stOutput.AppendLine(sHeaders.ToString());
// Export data.
for (int i = 0; i < dGV.RowCount - 1; i++)
{
StringBuilder stLine = new StringBuilder();
for (int j = 0; j < dGV.ColumnCount; j++)
{
stLine.Append(Convert.ToString(dGV[j, i].Value));
stLine.Append(separator);
}
stOutput.AppendLine(stLine.ToString());
}
File.WriteAllText(filename, stOutput.ToString());
}
I have did that in VB.net, and i convert it to c# with http://www.developerfusion.com/tools/convert/vb-to-csharp/, so you should test it.
VB.net code :
Imports System.Runtime.CompilerServices
Imports Excel = Microsoft.Office.Interop.Excel
Public Module ExcelMod
<Extension()> _
Public Function ToExcel(ByVal grd As DataGridView, ByVal path As String, Optional ByRef exp As Exception = Nothing) As Boolean
Dim res As Boolean = False
exp = Nothing
Dim xlApp As Excel.Application = Nothing
Dim xlWorkBook As Excel.Workbook = Nothing
Dim xlWorkSheet As Excel.Worksheet = Nothing
Try
Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
Dim misValue As Object = System.Reflection.Missing.Value
Dim i As Integer
Dim j As Integer
xlApp = New Excel.ApplicationClass
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
xlWorkBook = xlApp.Workbooks.Add(misValue)
xlWorkSheet = xlWorkBook.Sheets("sheet1")
Dim lastCol As Integer = 0
Dim lastRow As Integer = 0
For j = 0 To grd.ColumnCount - 1
If grd.Columns(j).Visible Then
xlWorkSheet.Columns(lastCol + 1).ColumnWidth = CInt(grd.Columns(j).Width / 10)
xlWorkSheet.Cells(1, lastCol + 1) = grd.Columns(j).HeaderText
lastCol += 1
End If
Next
lastRow = 0
For i = 0 To grd.RowCount - 1
lastCol = 0
For j = 0 To grd.ColumnCount - 1
If grd.Columns(j).Visible AndAlso grd.Rows(i).Visible Then
If grd(j, i).FormattedValue <> Nothing Then _
xlWorkSheet.Cells(lastRow + 2, lastCol + 1) = grd(j, i).FormattedValue.ToString()
lastCol += 1
End If
Next
If grd.Rows(i).Visible Then lastRow += 1
Next
xlWorkSheet.SaveAs(path)
xlWorkBook.Close()
xlApp.Quit()
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI
res = True
Catch ex As Exception
exp = ex
Finally
If xlApp IsNot Nothing Then releaseObject(xlApp)
If xlWorkBook IsNot Nothing Then releaseObject(xlWorkBook)
If xlWorkSheet IsNot Nothing Then releaseObject(xlWorkSheet)
End Try
Return res
End Function
Private Sub releaseObject(ByVal obj As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
obj = Nothing
Catch ex As Exception
obj = Nothing
Finally
GC.Collect()
End Try
End Sub
End Module
C# code :
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using Excel = Microsoft.Office.Interop.Excel;
public static class ExcelMod
{
public static bool ToExcel(this DataGridView grd, string path, ref Exception exp = null)
{
bool res = false;
exp = null;
Excel.Application xlApp = null;
Excel.Workbook xlWorkBook = null;
Excel.Worksheet xlWorkSheet = null;
try {
System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
object misValue = System.Reflection.Missing.Value;
int i = 0;
int j = 0;
xlApp = new Excel.ApplicationClass();
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = xlWorkBook.Sheets("sheet1");
int lastCol = 0;
int lastRow = 0;
for (j = 0; j <= grd.ColumnCount - 1; j++) {
if (grd.Columns(j).Visible) {
xlWorkSheet.Columns(lastCol + 1).ColumnWidth = Convert.ToInt32(grd.Columns(j).Width / 10);
xlWorkSheet.Cells(1, lastCol + 1) = grd.Columns(j).HeaderText;
lastCol += 1;
}
}
lastRow = 0;
for (i = 0; i <= grd.RowCount - 1; i++) {
lastCol = 0;
for (j = 0; j <= grd.ColumnCount - 1; j++) {
if (grd.Columns(j).Visible && grd.Rows(i).Visible) {
if (grd(j, i).FormattedValue != null)
xlWorkSheet.Cells(lastRow + 2, lastCol + 1) = grd(j, i).FormattedValue.ToString();
lastCol += 1;
}
}
if (grd.Rows(i).Visible)
lastRow += 1;
}
xlWorkSheet.SaveAs(path);
xlWorkBook.Close();
xlApp.Quit();
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
res = true;
} catch (Exception ex) {
exp = ex;
} finally {
if (xlApp != null)
releaseObject(xlApp);
if (xlWorkBook != null)
releaseObject(xlWorkBook);
if (xlWorkSheet != null)
releaseObject(xlWorkSheet);
}
return res;
}
private static void releaseObject(object obj)
{
try {
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
} catch (Exception ex) {
obj = null;
} finally {
GC.Collect();
}
}
}