Calgary won for just the second time in 10 games, getting a 32-save effort from Miikka Kiprusoff.
Vancouver had a 1-0 lead heading into the final period. Cammalleri's two goals, along with one from Curtis Glencross, handed the Canucks a disappointing setback -- costing Vancouver a chance to move in front of the New York Rangers for the best record in the NHL.
The Canucks had won seven in a row.
New York has the tiebreak advantage over Vancouver and thus needs just one point out of its final game Saturday to claim the Presidents' Trophy.
Vancouver also has a two-point lead over St. Louis for the best mark in the Western Conference.
Cory Schneider stopped 25 shots for Vancouver.
'How to Train Your Dragon 2' releases 5-minute clip
Yosemite climber falls 30 feet, suffers major injuries