waq127520 2020-03-19 21:25 采纳率: 0%
浏览 416

C#电脑没有office,代码中的excel引用无效吗

我的代码中有一句:Excel.Application app=new Excel.Application(),这个引用了Microsoft.Office.Interop.Excel.dll,我在自己的电脑上运行没问题,可是生成的软件装到别人没有office的电脑上就报错了:
图片说明

还有类似的报错不过都是COM组件的问题,我查了一下网上对这个报错的解决方式中首先确保电脑中必须有office,可是如果用这个软件的话还得再装一个office的话(我能想到的也就是把office打包进安装包里),那就有点动作太大了,求问各位大佬这种情况有没有不用安装office的解决途径?

  • 写回答

2条回答 默认 最新

  • 淡蓝色月夜 2020-03-19 21:40
    关注

    看你是需要操作Excel,那么使用LinqToExcel是可以的,或者使用第三方库,比如NPOI之类的。
    我刚才找了下,很久以前写了个方法,是winform的,你看看有帮助没。

    #region 导出为excel-npoi
            /// <summary>
            /// 弹窗选择保存路径-excel类型
            /// </summary>
            /// <param name="fileName">文件名</param>
            /// <returns>为空或者路径</returns>
            public static string GetFileNameSaveDialog(string fileName)
            {
                if (fileName == "")
                    return "";
    
                //保存的文件名
                string saveFileName = "";
                try
                {
                    SaveFileDialog saveDialog = new SaveFileDialog();
                    //默认文件名
                    saveDialog.FileName = fileName;
                    //默认文件类型
                    saveDialog.Filter = "Excel(*.xls)|*.xls|Excel(*.xlsx)|*.xlsx";
                    //默认文件类型显示顺序
                    saveDialog.FilterIndex = 2;
                    //点了取消
                    if (saveDialog.ShowDialog() == DialogResult.Cancel)
                        return "";
                    saveFileName = saveDialog.FileName;
                    //获取文件名,不带路径
                    string fileNameExt = saveFileName.Substring(saveFileName.LastIndexOf("\\") + 1);
                    //获取文件路径,不带文件名
                    //FilePath = localFilePath.Substring(0, localFilePath.LastIndexOf("\\"));
                    //获取后缀名
                    string ext = Path.GetExtension(saveFileName).ToLower();
                    //获取文件名,不带路径与后缀
                    string nameExt = fileNameExt.Replace(ext, "");
                    if (nameExt == "")
                        return "";
                }
                catch
                {
                    saveFileName = "";
                }
                return saveFileName;
            }
    
            /// <summary>
            /// DataTable导出excel-npoi
            /// </summary>
            /// <param name="dt">数据</param>
            /// <param name="fileName">文件名</param>
            /// <returns>0成功,1文件名为空,2点了取消,其它为catch</returns>
            public static string DataToExcel(DataTable dt, string fileName)
            {
                try
                {
                    if (dt == null || dt.Rows.Count == 0)
                        return "数据为空";
                    //文件后缀名
                    string ext = Path.GetExtension(fileName).ToLower();
    
                    IWorkbook workbook;
                    if (ext == ".xls")
                        workbook = new HSSFWorkbook();
                    else if (ext == ".xlsx")
                        workbook = new XSSFWorkbook();
                    else
                        return "文件后缀名错误";
    
                    //ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
                    ISheet sheet = workbook.CreateSheet("Sheet1");
    
                    #region 单元格及字体样式
                    //标题样式
                    ICellStyle styleHeader = workbook.CreateCellStyle();//创建样式对象
                    IFont fontHeader = workbook.CreateFont(); //创建一个字体样式对象
                    fontHeader.FontName = "黑体"; //和excel里面的字体对应
                    //fontHeader.IsItalic = true; //斜体
                    fontHeader.FontHeightInPoints = 12;//字体大小
                    //fontHeader.Boldweight = short.MaxValue;//字体加粗
                    styleHeader.SetFont(fontHeader); //将字体样式赋给样式对象
                    styleHeader.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;//单元格背景色
                    styleHeader.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;//与背景色一同设置边框
                    styleHeader.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
                    //styleHeader.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
                    styleHeader.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    
                    //内容样式
                    ICellStyle styleContent = workbook.CreateCellStyle();//创建样式对象
                    IFont fontContent = workbook.CreateFont(); //创建一个字体样式对象
                    fontContent.FontName = "宋体"; //和excel里面的字体对应
                    fontContent.FontHeightInPoints = 11;//字体大小
                    //fontContent.IsItalic = true; //斜体
                    //fontContent.Boldweight = short.MaxValue;//字体加粗
                    styleContent.SetFont(fontContent); //将字体样式赋给样式对象
                    //styleContent.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;//单元格背景色
                    //styleContent.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;//与背景色一同设置边框
                    styleContent.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
                    //styleContent.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
                    styleContent.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//边框
                    styleContent.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleContent.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleContent.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    
                    //row.Height = 30 * 20;//设置单元格的高度
                    //sheet.SetColumnWidth(0, 30 * 256);//设置单元格的宽度
                    #endregion
    
                    IRow row;
                    //数据
                    for (int i = 0; i <= dt.Rows.Count; i++)
                    {
                        row = sheet.CreateRow(i);
    
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            ICell cell = row.CreateCell(j);
                            if (i == 0)
                            {
                                cell.SetCellValue(dt.Columns[j].ColumnName);
                                cell.SetCellType(CellType.String);
                                cell.CellStyle = styleHeader;
                            }
                            else
                            {
                                cell.SetCellValue(dt.Rows[i - 1][j].ToString());
                                cell.SetCellType(CellType.String);
                                cell.CellStyle = styleContent;
                            }
                        }
                    }
    
                    //转为字节数组  
                    MemoryStream stream = new MemoryStream();
                    workbook.Write(stream);
                    var buf = stream.ToArray();
    
                    //保存为Excel文件  
                    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                    {
                        fs.Write(buf, 0, buf.Length);
                        fs.Flush();
                    }
                    stream.Close();
                    stream.Dispose();
                    return "0";
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
    
            /// <summary>
            /// DataTable导出excel-npoi
            /// </summary>
            /// <param name="dt">数据</param>
            /// <param name="gvw">控件-取列</param>
            /// <param name="fileName">文件名</param>
            /// <returns>0成功,1文件名为空,2点了取消,其它为catch</returns>
            public static string DataToExcel(DataTable dt, DataGridView gvw, string fileName)
            {
                try
                {
                    if (dt == null || dt.Rows.Count == 0)
                        return "数据为空";
                    //获取后缀名
                    string ext = Path.GetExtension(fileName).ToLower();
    
                    IWorkbook workbook;
                    if (ext == ".xls")
                        workbook = new HSSFWorkbook();
                    else if (ext == ".xlsx")
                        workbook = new XSSFWorkbook();
                    else
                        return "文件后缀名有误";
    
                    //ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
                    ISheet sheet = workbook.CreateSheet("Sheet1");
    
                    #region 单元格及字体样式
                    //标题样式
                    ICellStyle styleHeader = workbook.CreateCellStyle();//创建样式对象
                    IFont fontHeader = workbook.CreateFont(); //创建一个字体样式对象
                    fontHeader.FontName = "黑体"; //和excel里面的字体对应
                    //fontHeader.IsItalic = true; //斜体
                    fontHeader.FontHeightInPoints = 12;//字体大小
                    //fontHeader.Boldweight = short.MaxValue;//字体加粗
                    styleHeader.SetFont(fontHeader); //将字体样式赋给样式对象
                    styleHeader.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;//单元格背景色
                    styleHeader.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;//与背景色一同设置边框
                    styleHeader.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
                    //styleHeader.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
                    styleHeader.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleHeader.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    
                    //内容样式
                    ICellStyle styleContent = workbook.CreateCellStyle();//创建样式对象
                    IFont fontContent = workbook.CreateFont(); //创建一个字体样式对象
                    fontContent.FontName = "宋体"; //和excel里面的字体对应
                    fontContent.FontHeightInPoints = 11;//字体大小
                    //fontContent.IsItalic = true; //斜体
                    //fontContent.Boldweight = short.MaxValue;//字体加粗
                    styleContent.SetFont(fontContent); //将字体样式赋给样式对象
                    //styleContent.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index;//单元格背景色
                    //styleContent.FillPattern = NPOI.SS.UserModel.FillPattern.SolidForeground;//与背景色一同设置边框
                    styleContent.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;//水平居中
                    //styleContent.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;//垂直居中
                    styleContent.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;//边框
                    styleContent.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleContent.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
                    styleContent.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
    
                    //row.Height = 30 * 20;//设置单元格的高度
                    //sheet.SetColumnWidth(0, 30 * 256);//设置单元格的宽度
                    #endregion
    
                    IRow row;
                    ICell cell;
                    int cellIndex = 0;//单元格位置
                    for (int i = 0; i <= dt.Rows.Count; i++)
                    {
                        row = sheet.CreateRow(i);
                        for (int j = 0; j < gvw.ColumnCount; j++)
                        {
                            if (j == 0)
                                cellIndex = 0;
                            ///gvw列有效
                            if (gvw.Columns[j].Visible && gvw.Columns[j].DataPropertyName != "")
                            {
                                sheet.SetColumnWidth(cellIndex, 15 * 256);//设置第cellIndex列的宽度为15
                                if (i == 0)
                                {
                                    //表头
                                    cell = row.CreateCell(cellIndex);
                                    cell.SetCellValue(gvw.Columns[j].HeaderText);
                                    cell.SetCellType(CellType.String);
                                    cell.CellStyle = styleHeader;
                                }
                                else
                                {
                                    //数据
                                    cell = row.CreateCell(cellIndex);
                                    cell.SetCellValue(dt.Rows[i - 1][gvw.Columns[j].DataPropertyName].ToString());
                                    cell.SetCellType(CellType.String);
                                    cell.CellStyle = styleContent;
                                }
                                cellIndex++;
                            }
                        }
                    }
    
                    //转为字节数组  
                    MemoryStream stream = new MemoryStream();
                    workbook.Write(stream);
                    var buf = stream.ToArray();
    
                    //保存为Excel文件  
                    using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                    {
                        fs.Write(buf, 0, buf.Length);
                        fs.Flush();
                    }
                    stream.Close();
                    stream.Dispose();
                    return "0";
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }
            #endregion
    
    评论

报告相同问题?

悬赏问题

  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统
  • ¥188 需要修改一个工具,懂得汇编的人来。