当前位置:编程学习 > C#/ASP.NET >>

C# dataGridview 导出exlex格式问题


导出代码:


                savaexcel.Filter = "Excel文件(*.xls)|*.xls|Word文件(*.doc)|*.doc|Excel文件(*.xlsx)|*.xlsx";
                if (savaexcel.ShowDialog() == DialogResult.OK)
                {
                    string filename = savaexcel.FileName;
                    string str = string.Empty;
                    for (int i = 0; i < PCGridView.Columns.Count; i++)
                    {
                        str += PCGridView.Columns[i].HeaderText + "\t";//写标题
                        if (i == PCGridView.Columns.Count - 1)
                        {
                            str += "\r";
                        }
                    }
                    for (int i = 0; i < PCGridView.RowCount; i++)
                    {
                        for (int j = 0; j < PCGridView.Columns.Count; j++)
                        {
                            str += PCGridView.Rows[i].Cells[j].Value.ToString() + "\t";
                            if (j == PCGridView.Columns.Count - 1)
                            {
                                str += "\r";
                            }
                        }
                    }
                    StreamWriter sw = new StreamWriter(filename, true, Encoding.GetEncoding("gb2312"));
                    sw.Write(str);
                    sw.Close();
                }
                MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
            else
            {
                MessageBox.Show("导出失败,表格中不存在数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }


这段代码可以实现出扩展名为:*.xls格式的表格,为什么用*.xlsx把数据导出去后,打开表格会报如图错误:

???  我电脑上有这个版本的*.xlsx.
--------------------编程问答-------------------- --------------------编程问答-------------------- 导出.xls吧,.xlsx是要office2005以上版本才能打开或WPS也能打开 --------------------编程问答--------------------  str += "\r";改成 str += "\r\n";
 str += PCGridView.Rows[i].Cells[j].Value.ToString() + "\t";
换成
str += Regex.Replace(PCGridView.Rows[i].Cells[j].Value.ToString(), @"[^\S]", " ") + "\t";
预防内家中有\t或\r\n之类的
用记事本打开那个文件看看里面有内容是否正确? --------------------编程问答-------------------- 好我试试



引用 3 楼 c02645 的回复:
 str += "\r";改成 str += "\r\n";
 str += PCGridView.Rows[i].Cells[j].Value.ToString() + "\t";
换成
str += Regex.Replace(PCGridView.Rows[i].Cells[j].Value.ToString(), @"[^\S]", " ") + "\t";
预防内家中有\t或\r\n之类的
用记事本打开那个文件看看里面有内容是否正确?


按照你的方法改还是不能打开呀,用记事本打开里面的内容没有错 --------------------编程问答-------------------- 试试这个呢,网上的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Windows.Forms;

namespace CallSystem
{
    class Export
    {

        ///<summary>
        /// 将dataGridView对象里的数据导出到Excel中。
        ///</summary>
        ///<param name="datagridview">要导出数据的dataGirdView对象</param>
        ///<param name="SheetName">导出到Excel表格的名字</param>
        public void DataGridView2Excel(System.Windows.Forms.DataGridView datagridview, string SheetName)
        {
            try
            {
                int iRows = 0;

                int iCols = 0;

                int iTrueCols = 0;

                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

                Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);

                Microsoft.Office.Interop.Excel.Worksheet ws = null;

                if (wb.Worksheets.Count > 0)
                {

                    ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);

                }

                else
                {

                    wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);

                    ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);

                }

                if (ws != null)
                {

                    if (SheetName.Trim() != "")
                    {

                        ws.Name = SheetName;

                    }

                    iRows = datagridview.Rows.Count;      //加上列头行    

                    iTrueCols = datagridview.Columns.Count;   //包含隐藏的列,一共有多少列    

                    //求列数,省略Visible = false的列    

                    for (int i = 0; i < datagridview.Columns.Count; i++)
                    {

                        if (datagridview.Columns[i].Visible) iCols++;

                    }

                    string[,] dimArray = new string[iRows + 1, iCols];

                    for (int j = 0, k = 0; j < iTrueCols; j++)
                    {

                        //省略Visible = false的列    

                        if (datagridview.Columns[j].Visible)
                        {

                            dimArray[0, k] = datagridview.Columns[j].HeaderText;

                            k++;

                        }

                    }

                    for (int i = 0; i < iRows; i++)
                    {

                        for (int j = 0, k = 0; j < iTrueCols; j++)
                        {

                            //省略Visible = false的列    

                            if (datagridview.Columns[j].Visible)
                            {

                                dimArray[i + 1, k] = datagridview.Rows[i].Cells[j].Value.ToString();

                                k++;

                            }

                        }

                    }

          
                    Range rang = ws.Range[ws.Cells[2, 1], ws.Cells[iRows + 1, iCols]];
                    rang.Value = dimArray;

                    rang = ws.Range[ws.Cells[1, 1], ws.Cells[1, iCols]];
                    rang.Font.Bold = true;

                    rang = ws.Range[ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]];
                    rang.Font.Size = 10.0;

                    rang = ws.Range[ws.Cells[1, 1], ws.Cells[iRows + 1, iCols]];
                    rang.RowHeight=14.25;
                
                    for (int j = 0, k = 0; j < iTrueCols; j++)
                    {

                        //省略Visible = false的列    

                        if (datagridview.Columns[j].Visible)
                        {
                            rang = ws.Range[ws.Cells[1, k + 1], ws.Cells[1, k + 1]];
                            rang.ColumnWidth = (datagridview.Columns[j].Width / 8.4) > 255 ? 255 : (datagridview.Columns[j].Width / 8.4);
                            k++;

                        }

                    }

                }

                app.Visible = true;
            }
            catch (Exception e)
            {

                MessageBox.Show("程序检测不到Excel类库文件,可能是您未安装Office2003以上的版本。", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }

        }
    }
}
--------------------编程问答-------------------- 可能和你VS引用的Excel类库有关,我记得我当初换了个新版的Excel.dll之后就可以了 --------------------编程问答--------------------
引用 6 楼 xiaoxin3357 的回复:
可能和你VS引用的Excel类库有关,我记得我当初换了个新版的Excel.dll之后就可以了

换支持.xlsx的dll版本  --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,