How to export datagridview data to excel?

后端 未结 2 619
无人共我
无人共我 2021-01-15 09:53

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         


        
相关标签:
2条回答
  • 2021-01-15 10:30

    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());
        }
    
    0 讨论(0)
  • 2021-01-15 10:36

    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();
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题