zoukankan      html  css  js  c++  java
  • asp.net NPOI导出xlsx格式文件,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

    NPOI导出xlsx格式文件,会出现如下情况:

    导出代码如下:

    /// <summary>
            ///     将datatable数据写入excel并下载
            /// </summary>
            /// <param name="dt">datatable </param>
            /// <param name="excelName">文件名</param>
            /// <param name="templatePath">模板路径</param>
            /// <returns></returns>
            public static void DataTableToExcelAndDownload(DataTable dt, string excelName, string templatePath)
            {
                IWorkbook workbook = null;
                FileStream fs = null;
                IRow row = null;
                ISheet sheet = null;
                ICell cell = null;
                ICellStyle cellStyle = null;
    
                try
                {
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        var rowCount = dt.Rows.Count; //行数
                        var columnCount = dt.Columns.Count; //列数
    
                        using (fs = File.OpenRead(templatePath))
                        {
                            //大批量数据导出的时候,需要注意这样的一个问题,Excel2003格式一个sheet只支持65536行,excel 2007 就比较多,是1048576
                            //workbook = new HSSFWorkbook(fs);//2003版本.xls
                            workbook = new XSSFWorkbook(fs); // 2007版本.xlsx
                        }
    
                        if (workbook != null)
                        {
                            sheet = workbook.GetSheetAt(0); //读取第一个sheet
    
                            //设置每行每列的单元格,
                            for (var i = 0; i < rowCount; i++)
                            {
                                row = sheet.CreateRow(i + 1);
                                for (var j = 0; j < columnCount; j++)
                                {
                                    cell = row.CreateCell(j);
                                    var value = dt.Rows[i][j];
                                    var bdType = value.GetType().ToString();
                                    switch (bdType)
                                    {
                                        case "System.String":
                                            cell.SetCellValue(value.ToString());
                                            break;
                                        case "System.DateTime": //日期类型 
                                            cell.SetCellValue(
                                                Convert.ToDateTime(value.ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
                                            break;
                                        case "System.Int16": //整型   
                                        case "System.Int32":
                                        case "System.Int64":
                                        case "System.Byte":
                                            var intV = 0;
                                            int.TryParse(value.ToString(), out intV);
                                            cell.SetCellValue(intV);
                                            break;
                                        case "System.Decimal": //浮点型   
                                        case "System.Double":
                                            double doubV = 0;
                                            double.TryParse(value.ToString(), out doubV);//格式化值
                                            cellStyle = workbook.CreateCellStyle();
                                            cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");
                                            cell.SetCellValue(doubV);
                                            cell.CellStyle = cellStyle;                                        
                                            break;
                                        default:
                                            cell.SetCellValue(value.ToString());
                                            break;
                                    }
                                }
                            }
    
                            var context = HttpContext.Current;
                            context.Response.Clear();
                            context.Response.ContentType = "application/vnd.ms-excel";
                            context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + excelName);
                            using (var ms = new MemoryStream())
                            {
                                workbook.Write(ms);
    
                                long fileSize = ms.Length;
                                //加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
                                context.Response.AddHeader("Content-Length", fileSize.ToString());
    
                                context.Response.BinaryWrite(ms.GetBuffer());
                                context.ApplicationInstance.CompleteRequest();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                    ExceptionHandling.ExceptionHandler.HandleException(ex);
                }
            }

    加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”

    long fileSize = ms.Length;
    context.Response.AddHeader("Content-Length", fileSize.ToString());

    即可。

  • 相关阅读:
    markdown grammar
    vs the address of offline package
    步步为营-66-Socket通信
    步步为营-65-线程小例子
    线程使用中常见的错误-“System.InvalidOperationException”线程间操作无效: 从不是创建控件“ ”的线程访问它。
    步步为营-64-进程&线程
    步步为营-63-Asp.net-get与post
    步步为营-62-Excel的导入和导出
    步步为营-61-拼音组件
    步步为营-60-代码生成器
  • 原文地址:https://www.cnblogs.com/qk2014/p/7729215.html
Copyright © 2011-2022 走看看