我正在寻找使用 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工作表中,每列都是一个组,在其下面是已分配给每个组的用户列表
解决此问题的最佳方法是什么?
答案 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;
}