ExcelLibrary 导出Excel报 “excel发现不可读取的内容”错误

今天使用ExcelLibrary 做导出Excel,可是导出的数据用Excel2007以上版本打开的时候,总是报 “excel发现不可读取的内容”错误,令人非常费解,至今不知道是什么原因。

解决办法:

那就是通过限制导出数据的最少列数,在这段代码里限制为9,其实这个数字也不是准确的,但是是可以的,比如其它数字7,8也是可以,也就是通过这样一个技巧解决了,

还有,还不行的话就加行,把行也设置为最小比如30行

 

ExcelLibrary.SpreadSheet.Workbook workbook = new ExcelLibrary.SpreadSheet.Workbook();

                // 参数已生成工作表
                                   ExcelLibrary.SpreadSheet.Worksheet worksheet = new ExcelLibrary.SpreadSheet.Worksheet("FirstSheet");


                    #region 这一段代码没用,但是请不要删除,因为这里体现了一些数据类型显示的方法思想,要懂得举一反三,这里面还是有值得学习和参考的东西的
                    //worksheet.Cells[0, 1] = new Cell((short)1);
                    //worksheet.Cells[2, 0] = new Cell(9999999);
                    //worksheet.Cells[3, 3] = new Cell((decimal)3.45);
                    //worksheet.Cells[2, 2] = new Cell("Text string");
                    //worksheet.Cells[2, 4] = new Cell("Second string");
                    //worksheet.Cells[4, 0] = new Cell(32764.5, "#,##0.00");
                    //worksheet.Cells[5, 1] = new Cell(DateTime.Now, @"YYYY\-MM\-DD");
                    #endregion



                    int minColumnCount = 9;//这里设置为9,意思是导出的文档至少有9(这个数字不是一定的,7,8也都可以)列,如果数据不够9列,则为空。为什么这样做?因为这个导出在Excel2007以上版本中,少于9列竟然打不开,报错为“发现不可读取的内容 ”,没有找到好的解决办法,因此用这样一个技巧解决它
                    if (minColumnCount < dt.Columns.Count)
                    {
                        minColumnCount = dt.Columns.Count;
                    }
                    for (int j = 0; j < minColumnCount; j++)
                    {
                        if (j < dt.Columns.Count)
                        {
                            worksheet.Cells[0, j] = new Cell(dt.Columns[j].Caption);
                            int width = dicColumnWidth[dt.Columns[j].ColumnName] * 40;
                            if (width > 65535)//ushort类型的最大值为65535,所以要有这个判断,否则超过这个数字下面的类型转换就会报错
                                width = 65535;

                            worksheet.Cells.ColumnWidth[(ushort)j] = (ushort)width;//这里的ushort类型的数据和int的数据大小好像不一样,只要放大才能达到页面正常显示的效果,所以这里乘以了40,也就是放大了40倍
                        }
                        else
                        {
                            worksheet.Cells[0, j] = new Cell("");
                        }
                    }

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        for (int j = 0; j < minColumnCount; j++)
                        {
                            string text = "";
                            if (j < dt.Columns.Count)
                            {
                                if (dt.Rows[i][j] != DBNull.Value && dt.Rows[i][j] != null)
                                {
                                    text = dt.Rows[i][j].ToString();
                                    text = text.Replace(" ", "");
                                }
                                worksheet.Cells[i + 1, j] = new Cell(text); ;
                            }
                            else
                            {
                                worksheet.Cells[i + 1, j] = new Cell(""); ;
                            }
                        }
                    }

                    workbook.Worksheets.Add(worksheet);
                
                workbook.Save("c:/a.xls");

你可能感兴趣的:(疑难杂症)