如何创建一个操作Excel数据的程序来将ID分类?

时间:2017-04-11 23:13:19

标签: python excel vba sorting

我正在寻找使用 Python,Excel,VBA,Pandas和像xlwings 这样的Excel-Python模块的组合创建一个python程序,它将:

- 读取一个excel表,每行代表一个用户ID,每个用户id代表一个时间的以下列

- 根据用户行中的时间将用户ID分组。每个组将拥有最大数量的用户,如果该组已满,则将考虑下一次在给定用户的行中。 (即对于用户1,列出以下时间:B1 - 9AM,C1 - 10:30 AM,D1 - 11AM。尝试将用户1排序到9AM组,除非9AM组已满,在这种情况下尝试排序到上午10:30组等。)

- 为数千个ID和数百个组重复此公式

- 将数据重新分配到Excel工作表中,每列都是一个组,在其下面是已分配给每个组的用户列表

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找更强大的通用编程语言而不是VBA,我可能会建议您使用Microsoft Office .NET互操作库。我相信它是Microsoft Office的可选安装。然后,您可以使用任何.NET语言(包括Python http://ironpython.net)来查看文件,提取所需的数据,然后将其转储回来。

您需要小心,因为要获得最佳性能并不容易。

您还需要注意互操作文件库如何与Excel实例一起使用。它实际上打开了Excel的后台实例,它可能无法与打开的实例一起使用。我必须编写大量代码才能在程序完成时终止Excel实例,否则会崩溃并挂起。

这里是C#中的一些示例代码。您可以根据需要替换Python。您可以将C#和Python项目放在Visual Studio中的相同解决方案中,并来回引用。

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

Microsoft.Office.Interop.Excel.Application excel = null;
int excelHWnd = 0;

public static void KillProcessWithThisWindow(int hWnd)
{
    uint processID = 0;
    IntPtr window = new IntPtr(hWnd);
    uint threadId = GetWindowThreadProcessId(window, out  processID);
    Process p = Process.GetProcessById((int)processID);
    p.Kill();
}

private void OpenExcel()
{
    if (excel!=null)
        try { KillProcessWithThisWindow(excelHWnd); }
        catch (Exception ex) { Console.Error.WriteLine(ex.Message + ex.StackTrace); }
    excel = new Microsoft.Office.Interop.Excel.Application();
    excel.ScreenUpdating = false;
    excel.DisplayStatusBar = false;
    excel.EnableEvents = false;
    excelHWnd = excel.Hwnd;
}

private void Cleanup()
{
    try { excel.Quit(); }
    catch (Exception ex) { Console.Error.WriteLine(ex.Message + ex.StackTrace); }
    try { KillProcessWithThisWindow(excelHWnd); }
    catch (Exception ex) { Console.Error.WriteLine(ex.Message + ex.StackTrace); }
    excel = null;
}