对.NET中导出数据到EXCEL的几种方法探讨 C1TrueDBGrid

SAP顾问实战笔记:GGB0/GGB1配置校验与替代,从创建到激活的完整避坑指南 本文详细解析SAP财务模块中GGB0/GGB1配置校验(Validation)与替代(Substitution)的实战技巧,涵盖从创建到激活的全流程避坑指南。通过对比校验与替代的核心差异,提供配置陷阱、执行顺序优化等实用建议,帮助SAP顾问提升配置效率与系统性能。 阅读详情

最近在做一个报表系统的时候,需要把DATASET中的数据导到EXCEL当中,于是在网上找了一遍,发现了好几种方法,本来以为应该差不多,但后来经过一一试用后,发现在性能上真的差别很大,现在就介绍一下,同时有不对的希望可以指正:
 
1. 原理:利用office组件把dataset中的数据填充到excel文件当中。
这里我不贴出全部代码了,只把关键部分贴出来:
         ///<summary>
         ///方法,导出C1TrueDBGrid中的数据到Excel文件
         ///</summary>
         ///<param name="c1grid">C1TrueDBGrid</param>
         ///<param name="FileName">Excel文件名</param>
         public void ExportToExcel(C1.Win.C1TrueDBGrid.C1TrueDBGrid c1grid,string FileName)
         {
              if(FileName.Trim() == "") return;            //验证strFileName是否为空或值无效
 
              int rowscount = c1grid.Splits[0].Rows.Count; //定义表格内数据的行数
              int colscount = c1grid.Columns.Count;        //定义表格内数据的列数
 
              //行数必须大于0
              if (rowscount <= 0)
              {
                   MessageBox.Show("没有数据可供保存","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                   return;
              }
 
              //列数必须大于0
              if (colscount <= 0)
              {
                   MessageBox.Show("没有数据可供保存","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                   return;
              }
 
              //行数不可以大于65536
              if (rowscount > 65536)
              {
                   MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                   return;
              }
 
              //列数不可以大于255
              if (colscount > 255)
              {
                   MessageBox.Show("数据记录行数太多,不能保存","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                   return;
              }
        
              //将文件保存到工作路径的子目录“/Excel”下,如果路径不存在创建它
              string n_path = Directory.GetCurrentDirectory() + "//Excel";
              if (Directory.Exists(n_path) == false)
              {
                   Directory.CreateDirectory(n_path);
              }
 
              //验证以strFileName命名的文件是否存在,如果存在删除它
              FileInfo fi = new FileInfo(n_path + "//" + FileName + ".xls");
              if(fi.Exists)
              {
                   try
                   {
                       fi.Delete();
                   }
                   catch(Exception fie)
                   {
                       MessageBox.Show(fie.Message,"删除失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                       return;
                   }
              }
        
              Excel.ApplicationClass excel = null;
 
              try
              {
                   //显示进度条
                   KP.PublicForm.ProgressBar pb = new PublicForm.ProgressBar("导出进度");
                   pb.Show();
                   pb.Refresh();
 
                  //新建Excel应用,新建Workbook文件
                   excel = new Excel.ApplicationClass ( ) ;
                   Excel.XlSaveAsAccessMode savemode = new Excel.XlSaveAsAccessMode();
                   excel.Application.Workbooks.Add (true) ;
 
                   //向Excel中写入表格的表头
                   int i = 1;
                   for(int c = 0;c < colscount; c++)
                   {
                       if(c1grid.Splits[0].DisplayColumns[c].Visible)
                       {
                            excel.Cells[1,i] = c1grid.Columns[c].Caption;
                            i++;
                       }
                   }
        
                   //向Excel中逐行逐列写入表格中的数据
                   for(int r = 0; r < rowscount; r++)
                   {
                       Application.DoEvents();
                       pb.SetProgressBarValue(r+1, rowscount);
                       if(pb.Cancel)
                       {
                            break;
                       }
 
                       int j = 1;
                       for(int c = 0;c < colscount; c++)
                       {
                            if(c1grid.Splits[0].DisplayColumns[c].Visible)
                            {
                                 excel.Cells[r + 2,j] = c1grid.Columns[c].CellText(r);
                                 j++;
                            }
                       }
                   }
 
                   //向Excel中写入表格的脚
                   if(c1grid.ColumnFooters)
                   {
                       int col = 1;
                       for(int c = 0;c < colscount; c++)
                       {
                            if(c1grid.Splits[0].DisplayColumns[c].Visible)
                            {
                                 if(c1grid.Columns[c].FooterText != null && c1grid.Columns[c].FooterText.Trim() != "")
                                 {
                                     excel.Cells[rowscount + 2,col] = c1grid.Columns[c].FooterText;
                                 }
                                 col++;
                            }
                       }
                   }
 
                   //关闭进度条
                   pb.Close();
 
                   //设置Excel的默认保存路径为当前路径下的Excel子文件夹
                   excel.DefaultFilePath = n_path;
 
                   //保存文件
                   excel.ActiveWorkbook.SaveAs(FileName + ".xls",excel.ActiveWorkbook.FileFormat,"","",excel.ActiveWorkbook.ReadOnlyRecommended,excel.ActiveWorkbook.CreateBackup,savemode,excel.ActiveWorkbook.ConflictResolution,false,"","");
        
              }
              catch(Exception e1)
              {
                   MessageBox.Show(e1.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                   return;
              }
              finally
              {
                   //关闭Excel应用
                   if(excel != null) excel.Quit();
              }
              MessageBox.Show(FileName + "导出完毕,在" + Application.StartupPath + "//Excel文件夹下","提示", MessageBoxButtons.OK,MessageBoxIcon.Information);
//       }
 
}
 
       总结:这个方法是可以解决问题,但效率最差,3000条长点的record就用了6分钟,晕~~~~
 
2.   原理:利用office组件,同时把dataset的数据导到Clipboard中,然后通过粘贴到excel中。
         Excel.XlSaveAsAccessMode savemode = new Excel.XlSaveAsAccessMode();
                   xlApp.Application.Workbooks.Add (true) ;
                   xlApp.DefaultFilePath = @"c:/";
                   xlApp.ActiveWorkbook.SaveAs("exportExcel.xls",xlApp.ActiveWorkbook.FileFormat,"","",xlApp.ActiveWorkbook.ReadOnlyRecommended,xlApp.ActiveWorkbook.CreateBackup,savemode,xlApp.ActiveWorkbook.ConflictResolution,false,"","","");
        
             
 
 
                   Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(filePath, oMissing, oMissing, oMissing, oMissing, oMissing,
                       oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
                       oMissing,oMissing,oMissing);
                  
                   Excel.Worksheet xlWorksheet;
 
      
                   // 循环所有DataTable
                   for( int i=0; i<ds.Tables.Count; i++ )
                   {
                       xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.Add(oMissing,oMissing,1,oMissing);
                       // 以TableName作为新加的Sheet页名。
                       xlWorksheet.Name = ds.Tables[i].TableName;
                       // 取出这个DataTable中的所有值,暂存于stringBuffer中。
                       string stringBuffer = "";
                       //向Excel中写入表格的表头
                       if(node != null)
                       {
                            XmlNode nodec=node.SelectSingleNode("./Method/ShowField");
                            int ii = 1;
                            foreach(XmlNode xnode in nodec.ChildNodes )
                            {
                                 xlApp.Cells[1,ii] =xnode.Attributes["displayname"].Value;                               
                                 ii++;
                            }
                      
                           
                            for( int j=0; j<ds.Tables[i].Rows.Count; j++ )
                            {
                                 for( int k=0; k<ds.Tables[i].Columns.Count; k++ )
                                 {
             
                                     stringBuffer += ds.Tables[i].Rows[j][k].ToString();
                                     if( k < ds.Tables[i].Columns.Count - 1 )
                                          stringBuffer += "/t";
                                 }
                                 stringBuffer += "/n";
                            }
                           
                       }
                       else
                       {
                            int ii = 1;
                            for(int c = 0;c<ds.Tables[i].Columns.Count; c++)
                            {
                                 xlApp.Cells[1,ii] = ds.Tables[i].Columns[c].Caption;
                                 ii++;
                            }
                           
                            for( int j=0; j<ds.Tables[i].Rows.Count; j++ )
                            {
                                 for( int k=0; k<ds.Tables[i].Columns.Count; k++ )
                                 {
             
                                     stringBuffer += ds.Tables[i].Rows[j][k].ToString();
                                     if( k < ds.Tables[i].Columns.Count - 1 )
                                          stringBuffer += "/t";
                                 }
                                 stringBuffer += "/n";
                            }
                       }
 
                       System.Windows.Forms.Clipboard.SetDataObject("");
                       // 将stringBuffer放入剪切板。
                       System.Windows.Forms.Clipboard.SetDataObject(stringBuffer);
                       // 选中这个sheet页中的第一个单元格
                       ((Excel.Range)xlWorksheet.Cells[2,1]).Select();
                       // 粘贴!
                       xlWorksheet.Paste(oMissing,oMissing);
                       // 清空系统剪切板。
                       System.Windows.Forms.Clipboard.SetDataObject("");
                  
 
 
                  
                   }
                   // 保存并关闭这个工作簿。
                  
             
 
             
                           
                   xlApp.ActiveWorkbook.Close( Excel.XlSaveAction.xlSaveChanges, oMissing, oMissing );
                   //                 xlWorkbook.Close( Excel.XlSaveAction.xlSaveChanges, oMissing, oMissing );
                   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
                   xlWorkbook = null;
                   MessageBox.Show(@"Excel文件:C:/exportExcel.xls 导出成功!");
              }
              catch(Exception ex)
              {
                   MessageBox.Show(ex.Message);
              }
              finally
              {
                   // 释放...
                   xlApp.Quit();
                   System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
                   xlApp = null;
                   GC.Collect();
          }
 
       总结:这个方法比上面的方法性能好点,但还是很不好用,比原来的提高了2倍左右。
 
3. 原理:利用OLEDB,以excel为数据库,把dataset中的数据导入到excel文件中
       public static void exportToExcelByDataset(string filePath, DataSet ds,XmlNode node)
  {
   string sqlstr;


   if(fi.Exists)
   {
    fi.Delete();
    //     throw new Exception("文件删除失败");
   }
   else
   {
    fi.Create();
   }
  
   string sqlcon=@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended ProPerties=Excel 8.0;";
   OleDbConnection olecon = new OleDbConnection(sqlcon);
   OleDbCommand olecmd = new OleDbCommand();
   olecmd.Connection = olecon;
   olecmd.CommandType = CommandType.Text;
 

   try
   {
    olecon.Open();
           
    XmlNode nodec=node.SelectSingleNode("./Method/ShowField");
    int ii = 0;
    sqlstr = "CREATE TABLE sheet1(";
    foreach(XmlNode xnode in nodec.ChildNodes )
    {
     if(ii == nodec.ChildNodes.Count - 1)
     {
      if(xnode.Attributes["type"].Value.ToLower() == "int"||xnode.Attributes["type"].Value.ToLower() == "decimal")
      {
       sqlstr=sqlstr + xnode.Attributes["displayname"].Value + " number)";      
      }
      else
      {
       sqlstr=sqlstr + xnode.Attributes["displayname"].Value + " text)";
      }
      //      sqlstr=sqlstr + xnode.Attributes["displayname"].Value + " text)";
     }
     else
     {
      if(xnode.Attributes["type"].Value.ToLower() == "int"||xnode.Attributes["type"].Value.ToLower() == "decimal")
      {
       sqlstr=sqlstr + xnode.Attributes["displayname"].Value + " number,";      
      }
      else
      {
       sqlstr=sqlstr + xnode.Attributes["displayname"].Value + " text,";
      }
      
     }
     //     sqlstr =sqlstr + xnode.Attributes["displayname"].Value + " text";      
     ii++;
    }
    olecmd.CommandText = sqlstr;
    olecmd.ExecuteNonQuery();
    for(int i=0;i<ds.Tables[0].Rows.Count;i++)
    {
     sqlstr = "INSERT INTO sheet1 VALUES(";
     int jj=0;
     foreach(XmlNode inode in nodec.ChildNodes )
     {
      if(jj == nodec.ChildNodes.Count-1)
      {
       if(inode.Attributes["type"].Value.ToLower() == "int"||inode.Attributes["type"].Value.ToLower() == "decimal")
       {
        sqlstr = sqlstr + isnull(ds.Tables[0].Rows[i].ItemArray[jj].ToString()) + ")" ;
       
       }
       else
       {
        sqlstr = sqlstr + "'" + isnull(ds.Tables[0].Rows[i].ItemArray[jj].ToString().Replace("'","''")) + "')" ;
       }
      }
      else
      {
       if(inode.Attributes["type"].Value.ToLower() == "int"||inode.Attributes["type"].Value.ToLower() == "decimal")
       {
        sqlstr = sqlstr + isnull(ds.Tables[0].Rows[i].ItemArray[jj].ToString()) + "," ;
       
       }
       else
       {
        sqlstr = sqlstr + "'" + isnull(ds.Tables[0].Rows[i].ItemArray[jj].ToString().Replace("'","''")) + "'," ;
       }
      }
      jj++;
     }
     olecmd.CommandText = sqlstr;
     olecmd.ExecuteNonQuery();
    
    } 
    MessageBox.Show(@"Excel文件:" + filePath + " 导出成功!");
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
   finally
   {
    olecmd.Dispose();
    olecon.Close();
    olecon.Dispose();
                  
   }
  }
/// <summary>
/// change to string "null" if input is null
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
 
  private static string isnull(string obj)
  {
   if(obj.Length >0)
   {
    return obj;
   }
   else
   {
    return "null";
   }
  }
       总结:这个方法是最好的,速度飞快,比上面两种提高不止10倍,而且关键是不需要用到office组件,所以我正在用着这种方法,客户也满意。当然这个也有它不好的地方,有时候会受到导入的数据不符的异常困扰,而且为了赶时间,代码写的不好,一句话,能用但要改进的地方很多:)
      

 ///2007-03-02

最近发现几个导出到EXCEL的方法,这里先记录下来

4.本示例是用于将ListView中的内容倒入到Excel 与常用的逐单元格写不同的是,本例子采用数据写入到range的方法。该方法效率明显较高
Excel.Application app = new Excel.ApplicationClass();   
if( app == null)   
{
     MessageBox.Show("Excel无法启动");
     return;   
}
    app.Visible = true;
    Excel.Workbooks wbs = app.Workbooks;
    Excel.Workbook wb = wbs.Add(Missing.Value);
    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
    Excel.Range r = ws.get_Range("A1","H1");
    object [] objHeader = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8"};
    r.Value = objHeader;
    if (lv.Items.Count >0)
    {
     r = ws.get_Range("A2",Missing.Value);
       object [,] objData = new Object[this.lv.Items.Count,8];
     foreach(ListViewItem lvi in lv.Items)
     {
      objData[lvi.Index,0] = lvi.Text;
      objData[lvi.Index,1] = lvi.SubItems[1].Text;
      objData[lvi.Index,2] = lvi.SubItems[2].Text;
      objData[lvi.Index,3] = lvi.SubItems[3].Text;
      objData[lvi.Index,4] = lvi.SubItems[4].Text;
      objData[lvi.Index,5] = lvi.SubItems[5].Text;
      objData[lvi.Index,6] = lvi.SubItems[6].Text;
      objData[lvi.Index,7] = lvi.SubItems[7].Text;
     }
     r = r.get_Resize(lv.Items.Count,8);
     r.Value = objData;
     r.EntireColumn.AutoFit();
    }
    app = null;

5.由XML文件导出为EXCEL文件

目录下kfcccer.xml为原始数据XML文件,点击生成后会在同级目录下生成kfcccer.xls文件

页面代码如下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>XML转换Excel演示</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <div>
            <asp:Button ID="btnChange" runat="server" Font-Bold="True" Font-Size="18pt" ForeColor="Black"
                Height="38px" OnClick="btnChange_Click" Text="开始转换" Width="203px" /></div>
   
    </div>
    </form>
</body>
</html>

后台代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnChange_Click(object sender, EventArgs e)
    {
        try
        {
            //要转换的XML文件
            string XMLFileName = Path.Combine(Request.PhysicalApplicationPath, "kfcccer.xml");
            DataSet dsBook = new DataSet();
            dsBook.ReadXml(XMLFileName);
            int rows = dsBook.Tables[0].Rows.Count + 1;
            int cols = dsBook.Tables[0].Columns.Count;

            //将要生成的Excel文件
            string ExcelFileName = Path.Combine(Request.PhysicalApplicationPath, "kfcccer.xls");
            if (File.Exists(ExcelFileName))
            {
                File.Delete(ExcelFileName);
            }
            StreamWriter writer = new StreamWriter(ExcelFileName, false);
            writer.WriteLine("<?xml version="1.0"?>");
            writer.WriteLine("<?mso-application progid="Excel.Sheet"?>");
            writer.WriteLine("<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"");
            writer.WriteLine(" xmlns:o="urn:schemas-microsoft-com:office:office"");
            writer.WriteLine(" xmlns:x="urn:schemas-microsoft-com:office:excel"");
            writer.WriteLine(" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"");
            writer.WriteLine(" xmlns:html="http://www.w3.org/TR/REC-html40/">");
            writer.WriteLine(" <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">");
            writer.WriteLine("  <Author>Automated Report Generator Example</Author>");
            writer.WriteLine(string.Format("  <Created>{0}T{1}Z</Created>", DateTime.Now.ToString("yyyy-mm-dd"), DateTime.Now.ToString("HH:MM:SS")));
            writer.WriteLine("  <Company>51aspx.com</Company>");
            writer.WriteLine("  <Version>11.6408</Version>");
            writer.WriteLine(" </DocumentProperties>");
            writer.WriteLine(" <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">");
            writer.WriteLine("  <WindowHeight>8955</WindowHeight>");
            writer.WriteLine("  <WindowWidth>11355</WindowWidth>");
            writer.WriteLine("  <WindowTopX>480</WindowTopX>");
            writer.WriteLine("  <WindowTopY>15</WindowTopY>");
            writer.WriteLine("  <ProtectStructure>False</ProtectStructure>");
            writer.WriteLine("  <ProtectWindows>False</ProtectWindows>");
            writer.WriteLine(" </ExcelWorkbook>");
            writer.WriteLine(" <Styles>");
            writer.WriteLine("  <Style ss:ID="Default" ss:Name="Normal">");
            writer.WriteLine("   <Alignment ss:Vertical="Bottom"/>");
            writer.WriteLine("   <Borders/>");
            writer.WriteLine("   <Font/>");
            writer.WriteLine("   <Interior/>");
            writer.WriteLine("   <Protection/>");
            writer.WriteLine("  </Style>");
            writer.WriteLine("  <Style ss:ID="s21">");
            writer.WriteLine("   <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>");
            writer.WriteLine("  </Style>");
            writer.WriteLine(" </Styles>");
            writer.WriteLine(" <Worksheet ss:Name="MyReport">");
            writer.WriteLine(string.Format("  <Table ss:ExpandedColumnCount="{0}" ss:ExpandedRowCount="{1}" x:FullColumns="1"", cols.ToString(), rows.ToString()));
            writer.WriteLine("   x:FullRows="1">");

            //生成标题
            writer.WriteLine("<Row>");
            foreach (DataColumn eachCloumn in dsBook.Tables[0].Columns)
            {
                writer.Write("<Cell ss:StyleID="s21"><Data ss:Type="String">");
                writer.Write(eachCloumn.ColumnName.ToString());
                writer.WriteLine("</Data></Cell>");
            }
            writer.WriteLine("</Row>");

            //生成数据记录
            foreach (DataRow eachRow in dsBook.Tables[0].Rows)
            {
                writer.WriteLine("<Row>");
                for (int currentRow = 0; currentRow != cols; currentRow++)
                {
                    writer.Write("<Cell ss:StyleID="s21"><Data ss:Type="String">");
                    writer.Write(eachRow[currentRow].ToString());
                    writer.WriteLine("</Data></Cell>");
                }
                writer.WriteLine("</Row>");
            }
            writer.WriteLine("  </Table>");
            writer.WriteLine("  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            writer.WriteLine("   <Selected/>");
            writer.WriteLine("   <Panes>");
            writer.WriteLine("    <Pane>");
            writer.WriteLine("     <Number>3</Number>");
            writer.WriteLine("     <ActiveRow>1</ActiveRow>");
            writer.WriteLine("    </Pane>");
            writer.WriteLine("   </Panes>");
            writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
            writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
            writer.WriteLine("  </WorksheetOptions>");
            writer.WriteLine(" </Worksheet>");
            writer.WriteLine(" <Worksheet ss:Name="Sheet2">");
            writer.WriteLine("  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
            writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
            writer.WriteLine("  </WorksheetOptions>");
            writer.WriteLine(" </Worksheet>");
            writer.WriteLine(" <Worksheet ss:Name="Sheet3">");
            writer.WriteLine("  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");
            writer.WriteLine("   <ProtectObjects>False</ProtectObjects>");
            writer.WriteLine("   <ProtectScenarios>False</ProtectScenarios>");
            writer.WriteLine("  </WorksheetOptions>");
            writer.WriteLine(" </Worksheet>");
            writer.WriteLine("</Workbook>");
            writer.Close();
            Response.Write("<script language="javascript">" + "alert('" + "转换成功! 转换后的Excel文件名为: kfcccer.xls')" + "</script>");
        }
        catch (Exception ex)
        {
            Response.Write("<script language="javascript">" + "alert('" + "操作失败! 出错信息: " + ex.Message + "')" + "</script>");
        }
    }

docker-redmine 安装插件 文章目录redmine 安装插件redmine_issue_templates 模板管理插件安装步骤插件说明Redmine_issue_templateseasy_gantt安装sameersbn/redmine 4.1.1-9docker-compose.yaml拷贝easy_gantt插件进入容器安装插件开启easy_gantt插件后报错:Internal errorredmine_lightbox2插件源码地址安装命令agile-light插件源码地址安装命令 redmine 安装插件 https: 阅读详情

相关推荐

Redmine安装部署

1、打开VirtualBox,选中工具,点击导入,导入下载好的redmine安装包,点击下一步。直接在搜索引擎里搜索:Microsoft Visual C++ 可再发行程序包最新支持的下载。2、点击启动按钮,等待加载完成。可以查看remine账号密码,以及虚拟机账号和密码。3、输入虚拟机账号和密码(密码不可见),回车,提示修改密码忽略回车即可。4、在网页输入ip address,即可使用redmine。2、点击完成,并同意授权协议。下载完成后,点击安装。一、安装Redmine。1、下载Redmine。

qq_41138510的博客 5650

ComponentOne True DBGrid 8.0

True DataControl is an ActiveX control that serves as an OLE DB/ADO data source for building applications. It is a “better data source control;” a replacement for standard data sources such as the Microsoft ADO data control (ADODC) and Visual Basic's DataEnvironment. It is mainly designed for Visual Basic 6.0, but can also be used in other environments, including web-based applications.

linux下redmine安装部署

linux下redmine安装部署redmine简介Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示。同时它又支持多项目管理。Redmine是一个自由开放 源码软件解决方案,它提供集成的项目管理功能,问题跟踪,并为多个版本控制选项的支持。虽说像IBM Rational Team Concert的商业项目调查工具已经很强大了,但想坚持一个自由和

杜伟的博客 8114

DotNetBar SuperGrid

是DotNetBar控件中的SuperGrid控件,版本是10.5.0.3

DataGridView导出Excel

private void SaveAs() //另存新档按钮   导出Excel            {                SaveFileDialog saveFileDialog = new SaveFileDialog();             saveFileDialog.Filter = "Execl files (*.xls)|*.xls";      

leejin_521的专栏 573

Gridview导出Excel 指定显示列

有两个办法: 第1个办法:在导出excel的事件中,在最前面,把Gridview中不需要输出的列给隐藏掉(比如隐藏第1列:AbilityLicenceGrd.Columns[0].Visible = false;), 第2个办法:直接从数据库获取数据而不是从gridview。你可以把数据库取到DataTable中(取的时候过滤到不需要的列),然后把这个DataTable中的数据以htt...

387

delphi excel

dbgrid数据导出excel uses Excel2000,ComObj; procedure F_Form.Button1Click(Sender: TObject); var myExcel:TExcel; Int_i,Int_j,rowCount,columnCount:Integer; ExcelId:Variant; beg...

dkopg24406的专栏 246

redmine的三部曲 第一步安装redmine

作为项目管理工具,redmine在中小企业和50人之内的小团队中还是有一席之位的。redmine的具体介绍在“百度百科”中更加详细,我也就不再赘述。现在具体说说 redmine的安装过程。 PS:我以下所述的是WINDOSXP环境下redmine的安装过程,部分内容涉及到win7.安装过程中肯定会遇到各种各样的错误,你一定要有心理准备。 1.安装ruby. ruby有好几个版...

想改变世界的一点点中的一点点的木子 183

TrueDBGrid7数据表格控件加破解

TrueDBGrid7数据表格控件加破解

C#,asp.net 简单明了的导出Excel! 只要几行代码

C#,asp.net 简单明了的导出Excel! 只要几行代码,只要引用到一个类,即可导出你要导出数据,不用用代码一行行编译导出excel格式,我这里都帮你封装好了,只要你链接数据库,读出表,导出excel,就又你要的数据了,本人测试过,不明白可以@我。

docker随身笔记二之安装redmine

执行 docker search redmine ,如截图所属可以找到所有关于redmine的版本及其信息 docker pull redmine ,从镜像厂库拉取最新版的 redmine docker images ,查看镜像,如下图所示,redmine镜像为最新版本 因为redmine需要依赖数据库,本文采用的是mysql,因此首先需要再docker中安装mysql,docker安...

wangqiubo2010的博客 1314

Redmine安装文档

Redmine安装文档 环境:win10x64,Redmine-3.4.5,以下操作都是在没有翻墙的情况下执行的 以下命令大多是在RedMine项目根目录进行运行 1.安装rubyinstaller-devkit-2.4.4-1-x64.exe 下载地址:https://github-production-release-asset-2e65be.s3.amazonaws.com/7815...

秦秋雨的专栏 2528

docker安装redmine

最简单安装 docker run -d --name some-redmine -p 80:3000 redmine 运行成功后,http://ip访问即可,默认用户密码:admin/admin,该方式使用SQLite3作为数据库,生产环境不推荐使用此方式安装 选择数据库安装 推荐使用该方式进行安装 启动数据库容器(任选一种) PostgreSQL docker run -d --name some-postgres --network some-network -e POSTGRES_PASSW

椰汁菠萝 4289

在windows上安装redmine

手动在windows上安装redmine,运行bundler安装依赖包

忘一 Blog 1802
上一篇: 将 Visual Basic 6.0 项目升级到 Visual Basic .NET ItemData 属性
下一篇: 存储过程
liyingju
博客等级 码龄19年 7粉丝 24原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值