导出EXCEL我是用的拼XML串的方式导出的,没有问题,但是导出的这个EXCEL文件编辑后再导入就出错--外部表不是预期的格式。查了很多资料,都说是EXCEL格式不对必须是EXCEL的原始文件。可是怎么能导出原始格式的EXCEL文件呀。请各们给点意见。

解决方案 »

  1.   

    不知道对你会不会有所帮助
    public static class INGCSV
        {
            #region 变量
            /// <summary>
            /// 取出配置文件中的分隔符
            /// </summary>
            private static string _splitChar = null;        /// <summary>
            /// 取出配置文件中的编码方式
            /// </summary>
            private static string _encodeFormat = null;
            #endregion        #region 构造方法
            /// <summary>
            /// 构造方法获取分隔符、编码方式
            /// </summary>
            static INGCSV()
            {
                _splitChar = INGConfig.GetConfig(INGConstants.XML_CONFIG, INGConstants.XML_CSV_SPLIT, INGConstants.XML_SPLIT_CHAR);
                _encodeFormat = INGConfig.GetConfig(INGConstants.XML_CONFIG, INGConstants.XML_ENCODING, INGConstants.XML_ENCODE_FORMAT);
            }
            #endregion        #region 写CSV方法
            /// <summary>
            /// 写入CSV
            /// </summary>
            /// <param name="hasHeader">列头</param>
            /// <param name="dtOutputCSV">文件内容</param>
            public static void WriteCSV(bool hasHeader, DataTable dtOutputCSV)
            {
                // Log开始
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);            // 获取写入文件名称以及格式
                String strFileName;
                SaveFileDialog savFileDialog = new SaveFileDialog();            savFileDialog.Reset();
                savFileDialog.DefaultExt = "csv";
                savFileDialog.Filter = "CSV|*.csv";
                savFileDialog.ShowDialog();            strFileName = savFileDialog.FileName;            // 判断文件名
                if (string.IsNullOrEmpty(strFileName))
                {
                    // 信息提示
                    INGMessage.ShowMessage("M009", "WriteFileName");
                }            // 重载方法调用,写入文件
                WriteCSV(hasHeader, dtOutputCSV, strFileName);            // Log结束
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
            }
            #endregion        #region 写入CSV,附带路径方法
            /// <summary>
            /// 写入CSV,附带路径
            /// </summary>
            /// <param name="hasHeader">列头</param>
            /// <param name="dtOutputCSV">文件内容</param>
            /// <param name="strPath">指定文件路径</param>
            public static void WriteCSV(bool hasHeader, DataTable dtOutputCSV, string strPath)
            {
                // Log开始
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);            // DataTable有无判断
                if (dtOutputCSV == null)
                {
                    throw new ArgumentNullException("Argument(dtOutputCSV) is null!");
                }            // StringBuilder初始化
                StringBuilder sb = new StringBuilder();            // DataTable有无数据判断
                if (hasHeader)
                {
                    //添加列头
                    foreach (DataColumn dc in dtOutputCSV.Columns)
                    {
                        if (dc.DataType == Type.GetType("System.String"))
                        {
                            dc.ColumnName = "'" + dc.ColumnName + "'";   //修改
                        }
                        sb.Append(dc.ColumnName).Append(_splitChar);
                    }
                    // 创建新行
                    sb.Remove(sb.Length - 1, 1);
                    sb.Append(Environment.NewLine);
                }
                // 路径为空或者取消保存时
                if(strPath == "")
                {
                    return;
                }
                // 添加行
                foreach (DataRow dr in dtOutputCSV.Rows)
                {
                    foreach (object rowItem in dr.ItemArray)//object rowItem
                    {
                        object itemValue = rowItem;
                        itemValue = "'" + itemValue + "'";
                        sb.Append(itemValue).Append(_splitChar);
                    }
                    // 创建新行
                    sb.Remove(sb.Length - 1, 1);
                    sb.Append(Environment.NewLine);
                }            using (TextWriter tw = new StreamWriter(strPath, false, Encoding.GetEncoding(_encodeFormat)))
                {
                    tw.Write(sb.ToString());
                    INGMessage.ShowMessage("M010", "Success");
                    tw.Flush();
                    tw.Close();
                    
                }            // Log结束
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
            }
            #endregion        #region 读CSV文件方法
            /// <summary>
            /// 读CSV文件
            /// </summary>
            /// <param name="hasHeader">列头</param>
            /// <returns>返回信息</returns>
            public static DataTable ReadCSV(bool hasHeader)
            {
                // Log开始
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
                String strFileName;
                using (OpenFileDialog ofdFileDialog = new OpenFileDialog())
                {
                    ofdFileDialog.Reset();
                    ofdFileDialog.DefaultExt = "csv";
                    ofdFileDialog.Filter = "CSV|*.csv";
                    ofdFileDialog.ShowDialog();                // 文件名取得
                    strFileName = ofdFileDialog.FileName;
                }            // 文件路径取得
                String strFilePath = Path.GetFileName(strFileName);            // 文件路径判断
                if (string.IsNullOrEmpty(strFilePath))
                {
                    return null;
                }            // Log结束
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
                return ReadCSV(hasHeader, strFilePath);
            }
            #endregion        #region 读指定路径CSV文件方法
            /// <summary>
            /// 读指定路径CSV文件
            /// </summary>
            /// <param name="hasHeader">列头</param>
            /// <param name="strPath">指定文件路径</param>
            /// <returns>返回信息</returns>
            public static DataTable ReadCSV(bool hasHeader, string strPath)
            {
                // Log开始
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START);
                String FileName = Path.GetFileName(strPath);            // 文件路径判断
                if (string.IsNullOrEmpty(FileName))
                {
                    return null;
                }            DataTable dt = new DataTable(FileName);            // 文本文件分析instance生成
                TextFieldParser parser = new TextFieldParser(strPath, Encoding.GetEncoding(_encodeFormat));            // 指定文件形式
                parser.TextFieldType = FieldType.Delimited;            // 段落分割
                parser.SetDelimiters(_splitChar);            // 设置CSV行计数
                int iRowCnt = 0;            // 到文件最后边界            
                while (!parser.EndOfData)
                {
                    // 读入一行
                    string[] row = parser.ReadFields();
                    // CSV行判断
                    if (iRowCnt.Equals(0))
                    {
                        // 判断列头有无
                        if (hasHeader)
                        {
                            int i = 0;
                            // 添加列到行
                            foreach (string sColumn in row)
                            {
                                // DataColumn初始化
                                DataColumn column = new DataColumn();
                                column.DataType = Type.GetType("System.String");                            string sColumnValue = sColumn;
                                sColumnValue = sColumnValue.Substring(1, sColumnValue.Length - 2);                            column.ColumnName = sColumnValue;
                                dt.Columns.Add(column);
                            }
                        }
                    }
                    // 数据
                    else   //修改
                    {
                        // 行添加
                        int rowLength = row.Length;
                        DataRow dr = dt.NewRow();
                        for (int j = 0; j < rowLength;j++ )
                        {
                            string columnValue = row.GetValue(j).ToString();
                            columnValue = columnValue.Substring(1, columnValue.Length - 2);
                            dr[j] = columnValue;
                        }
                        dt.Rows.Add(dr);
                    }
                    // CSV行计数
                    iRowCnt++;
                }            // Log结束
                INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END);
                return dt;
            }
            #endregion
        }
      

  2.   


     public void DataToExcel(DataGridView dataGridView, ProgressBar progressBar)
    {
        if (dataGridView.RowCount == 0)
        {
            MessageBox.Show("没有可导出的数据!");
        }    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
        excel.Application.Workbooks.Add(true);    for (int i = 0; i < dataGridView.ColumnCount; i++)
        {
            excel.Cells[1, i + 1] = dataGridView.Columns[i].HeaderText;
        }    for (int i = 0; i < dataGridView.RowCount - 1; i++)
        {
            for (int j = 0; j < dataGridView.ColumnCount; j++)
            {
                excel.Cells[i + 2, j + 1] = dataGridView.Rows[i].Cells[j].Value.ToString();
            }                
        }
            excel.Visible = true;
    }这是将DataGridView中的数据导出为excel源文件的代码。DataSet的也差不多。
    要添加一个Excel一个引用。