To solve this optimization problem, we first need to define the decision variables, the objective function, and the constraints based on the given information.

Let's denote:
- \(x\) as the number of regular desks produced.
- \(y\) as the number of standing desks produced.

The objective is to maximize profit. Given that the profit per regular desk is $200 and per standing desk is $300, our objective function can be written as:
\[ \text{Maximize: } 200x + 300y \]

We have two main constraints based on the resources available:
1. **Wood Constraint**: Regular desks require 20 units of wood each, and standing desks require 15 units of wood each. The company has 4000 units of wood available.
\[ 20x + 15y \leq 4000 \]

2. **Packaging Time Constraint**: Regular desks take 10 minutes to package, and standing desks take 20 minutes to package. The company has 1500 minutes of packaging time available.
\[ 10x + 20y \leq 1500 \]

Additionally, we know that \(x\) and \(y\) must be non-negative since they represent quantities of desks.

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Desk_Production")

# Define variables
x = m.addVar(name="regular_desks", vtype=GRB.INTEGER, lb=0)
y = m.addVar(name="standing_desks", vtype=GRB.INTEGER, lb=0)

# Set objective function
m.setObjective(200*x + 300*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(20*x + 15*y <= 4000, name="wood_constraint")
m.addConstr(10*x + 20*y <= 1500, name="packaging_time_constraint")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Produce {x.x} regular desks and {y.x} standing desks.")
else:
    print("No optimal solution found.")
```