【问题标题】:Sorting excel sheet in reverse order on basis of created time / reversing the excel sheet根据创建时间以相反的顺序对excel表进行排序/反转excel表
【发布时间】:2011-09-26 18:40:09
【问题描述】:

我正在使用 Microsoft interop excel 来自动化 excel 工作簿 在其中我有许多工作表(比如 40 个),它们是在几秒钟内创建的,甚至更少 现在我必须以相反的顺序呈现工作表,即首先创建的工作表应该在打开时排在第一位(目前它排在最后)简而言之我必须以相反的顺序或按创建时间对 Excel 工作表进行排序

在这件事上的任何帮助

thnx

【问题讨论】:

    标签: c# excel excel-2007 worksheet-function excel-interop


    【解决方案1】:

    据我所知,Excel 不会存储每张工作表的创建日期和时间。但是,每个新工作表都会添加到工作簿的每个工作表的末尾。
    所以,你可以根据这个假设颠倒顺序。

    这是一个 VBA 宏来执行此操作,您只需将其调整为互操作或 C#:

    Sub reverseOrder()
    Dim i As Integer
    For i = Worksheets.Count - 1 To 1 Step -1
        Worksheets(i).Move After:=Worksheets(Worksheets.Count)
    Next i
    End Sub
    

    它将工作表从最后一个工作表之前的一个工作表解析到第一个工作表,并将每个工作表移动到最后一个位置

    【讨论】:

    • 我想知道以相反的顺序创建工作表是否是个好主意?如果选择了第一个工作表,Sheet.Add 的默认值为 Before。
    • @Remou:这也是个好主意。我从 OP 的问题中了解到,他在创建工作表时不能干扰工作簿,但只能在之后。因此我的解决方案。
    • @JMax thts true..我想在所有工作表创建后遍历..让我看看它是否有效.....
    【解决方案2】:
    Workbook wb = app.Workbooks.Open(Form1.strRecentFilename, temp, temp, temp, temp, temp, temp, temp, temp, temp, temp, temp, temp, temp, temp);
            int count = wb.Worksheets.Count;
            Worksheet ws, lastws;
            lastws = (Worksheet)wb.Worksheets[count];
            MessageBox.Show(lastws.Name);
            for (int i = count - 1; i >= 1; i--)
            {
                lastws = (Worksheet)wb.Worksheets[count];
                ws = (Worksheet)wb.Worksheets[i];
                ws.Move(System.Reflection.Missing.Value, lastws);
            }
    

    【讨论】:

      【解决方案3】:

      因此,如果您在 excel 文件中有工作簿的工作表,并且您需要对工作表的字母进行排序:

         public void SortWs()
         {
              List<Worksheet> for_sort = new List<Worksheet>();
      
              foreach (Worksheet ws in wb.Worksheets)
              {
                  for_sort.Add(ws);
              }
      
              for_sort.Sort(delegate(Worksheet wst1, Worksheet wst2)
              {
                  return wst1.Name.CompareTo(wst2.Name);//sort by worksheet's name
              });
      
              Worksheet ws1, ws2;
      
              for (int i = 0; i < for_sort.Count; i++)
              {
                  for (int j = 1; j <= wb.Worksheets.Count; j++)
                  {
                      ws1 = (Worksheet)wb.Worksheets[j];
                      if (for_sort[i].Name == ws1.Name)
                      {
                          ws2 = (Worksheet)wb.Worksheets[i+1];
                          ws1.Move(ws2, Type.Missing);
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 2022-01-07
        • 2022-01-03
        • 2022-06-11
        相关资源
        最近更新 更多